Spring-Boot Jersey:允许Jersey提供静态内容

wnrlj8wa  于 2024-01-06  发布在  Spring
关注(0)|答案(4)|浏览(182)

该应用程序使用JDK 8,Sping Boot 和Sping Boot Jersey启动器,并打包为WAR(尽管它通过Sping Boot Maven插件在本地运行)。
我想做的是让我在飞行中(在构建时)生成的文档作为欢迎页面。
我尝试了几种方法:
1.通过在application.properties中配置正确的init参数,让Jersey提供静态内容,如here所述
1.引入metadata-complete=falseweb.xml,以便将生成的HTML文档列为欢迎文件。
但都没成功。
我想避免启用Spring MVC或创建Jersey资源只是为了服务静态文件。
你知道吗?
下面是Jersey配置类(我尝试在那里添加一个ServletProperties.FILTER_STATIC_CONTENT_REGEX,但没有成功):

  1. @ApplicationPath("/")
  2. @ExposedApplication
  3. @Component
  4. public class ResourceConfiguration extends ResourceConfig {
  5. public ResourceConfiguration() {
  6. packages("xxx.api");
  7. packages("xxx.config");
  8. property(ServerProperties.BV_DISABLE_VALIDATE_ON_EXECUTABLE_OVERRIDE_CHECK, true);
  9. property(ServerProperties.BV_SEND_ERROR_IN_RESPONSE, true);
  10. }
  11. }

字符串
这里是Sping Boot 应用程序类(我尝试使用spring.jersey.init.jersey.config.servlet.filter.staticContentRegex=/.*html添加application.properties,但它不起作用,我不确定这里的属性键应该是什么):

  1. @SpringBootApplication
  2. @ComponentScan
  3. @Import(DataConfiguration.class)
  4. public class Application extends SpringBootServletInitializer {
  5. @Override
  6. protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
  7. return application.sources(Application.class);
  8. }
  9. public static void main(String[] args) {
  10. SpringApplication.run(Application.class, args);
  11. }
  12. }

yh2wf1be

yh2wf1be1#

让我先声明一下,静态内容不会被提供的原因是因为Jersey servlet的默认servletMap,即/*,并占用了所有请求。因此,无法访问提供静态内容的默认servlet。除了下面的解决方案,另一种解决方案是简单地更改servletMap。您可以通过使用@ApplicationPath("/another-mapping")注解ResourceConfig子类或设置application.properties属性spring.jersey.applicationPath来实现这一点。
关于你的第一种方法,看看Jersey ServletProperties。你试图配置的属性是FILTER_STATIC_CONTENT_REGEX。它声明:
该属性仅在Jersey servlet容器配置为作为筛选器运行时适用,否则将忽略该属性
Sping Boot 默认情况下将Jersey servlet容器配置为Servlet(如此处所述):
默认情况下,Jersey将被设置为jerseyServletRegistration类型的@Bean中的Servlet。您可以通过创建一个同名的bean来禁用或覆盖该bean。**您还可以通过设置spring.jersey.type=filter**来使用Filter而不是Servlet(在这种情况下,要替换或覆盖的@BeanjerseyFilterRegistration)。
所以只要在你的application.properties中设置属性spring.jersey.type=filter,它就应该工作了。我已经测试过了。
仅供参考,无论是配置为Servlet过滤器还是Servlet,就Jersey而言,功能是相同的。
顺便说一句,如果你需要设置一些复杂的正则表达式来处理所有的静态文件,你可以使用FILTER_FORWARD_ON_404,而不是使用FILTER_STATIC_CONTENT_REGEX

  1. @Component
  2. public class JerseyConfig extends ResourceConfig {
  3. public JerseyConfig() {
  4. packages("...");
  5. property(ServletProperties.FILTER_FORWARD_ON_404, true);
  6. }
  7. }

字符串

展开查看全部
esyap4oy

esyap4oy2#

对于那些仍然不能让这个工作的人,我遵循了@peeskillet提供的答案,并且不得不做一个额外的改变。
之前我在Application.java中创建了以下方法。

  1. @Bean
  2. public ServletRegistrationBean jerseyServlet() {
  3. ServletRegistrationBean registration = new ServletRegistrationBean(new ServletContainer(), "/*");
  4. registration.addInitParameter(ServletProperties.JAXRS_APPLICATION_CLASS, JerseyConfig.class.getName());
  5. return registration;
  6. }

字符串
问题是,这会为/*路径注册servlet,然后设置Jersey ResourceConfig配置文件。
一旦我删除了上面的方法,并将@Configuration注解放在我的ResourceConfig类上,我注意到静态资源可以通过Sping Boot 检索。
为了完整起见,这是我的ResourceConfig的一个片段。

  1. @Configuration
  2. public class JerseyConfig extends ResourceConfig {
  3. public JerseyConfig() {
  4. // Application specific settings
  5. property(ServletProperties.FILTER_FORWARD_ON_404, true);
  6. }
  7. }


This blog post有助于确定ResourceConfig的差分方法。

展开查看全部
f1tvaqid

f1tvaqid3#

下面的设置为我工作

设置

  1. spring .jersey.type: filter

字符串

setFILTER_FORWARD_ON_404

  1. @Configuration
  2. public class MyResourceConfig extends ResourceConfig {
  3. public MyResourceConfig () {
  4. try {
  5. register(XXX.class);
  6. property(ServletProperties.FILTER_FORWARD_ON_404, true);
  7. } catch (Exception e) {
  8. LOGGER.error("Exception: ", e);
  9. }
  10. }
  11. }


注意:使用**@Configuration代替@component**

展开查看全部
lzfw57am

lzfw57am4#

在我们的例子中,我们的项目完全基于jersey JAX-RS构建,所以我们不能将其用作过滤器,因为它会破坏整个项目。
spring-boot-starter-web添加到您的依赖项中,将spring MVC添加到您的classpath中。由于spring actuator构建在MVC上,因此您需要更改上下文路径。

  1. server.servlet.context-path=/
  2. spring.mvc.servlet.path=/management
  3. spring.jersey.application-path=/

字符串
1.将web服务器(tomcat)servlet上下文路径设置为/
1.将spring mvc servlet路径设置为/management,这样你的actuator端点就变成了/management/actuator/health
1.像往常一样将jersey上下文设置为/,以使其他路由按原样工作
参考-https://docs.spring.io/spring-boot/docs/1.4.1.RELEASE/reference/html/howto-actuator.html

相关问题