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

Rol*_*olf 17 java maven jersey-2.0 spring-boot

该应用程序使用JDK 8,Spring Boot和Spring Boot Jersey启动程序,并打包为WAR(尽管它通过Spring Boot Maven插件在本地运行).

我想要做的是将我生成的文档(在构建时)生成为欢迎页面.

我尝试了几种方法:

  1. 让泽西通过配置在服务内容静application.properties 正确初始化参数描述这里
  2. 引入一个metadata-complete=false web.xml以便将生成的HTML文档列为欢迎文件.

这些都没有成功.

我想避免为了提供静态文件而启用Spring MVC或创建Jersey资源.

任何的想法?

这是Jersey配置类(我没有尝试添加ServletProperties.FILTER_STATIC_CONTENT_REGEX那里):

@ApplicationPath("/")
@ExposedApplication
@Component
public class ResourceConfiguration extends ResourceConfig {

   public ResourceConfiguration() {
      packages("xxx.api");
      packages("xxx.config");
      property(ServerProperties.BV_DISABLE_VALIDATE_ON_EXECUTABLE_OVERRIDE_CHECK, true);
      property(ServerProperties.BV_SEND_ERROR_IN_RESPONSE, true);
   }
}
Run Code Online (Sandbox Code Playgroud)

这里是春天启动应用程序类(我尝试添加一个application.properties带有spring.jersey.init.jersey.config.servlet.filter.staticContentRegex=/.*html但它没有工作,我不能完全肯定的属性键应该在这里什么):

@SpringBootApplication
@ComponentScan
@Import(DataConfiguration.class)
public class Application extends SpringBootServletInitializer {

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(Application.class);
    }

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}
Run Code Online (Sandbox Code Playgroud)

Pau*_*tha 30

让我首先说明,静态内容不会被提供的原因是由于Jersey servlet的默认servlet映射,这是/*并且占用了所有请求.因此无法访问提供静态内容的默认servlet.除了以下解决方案,另一个解决方案是简单地更改servlet映射.您可以通过ResourceConfig使用@ApplicationPath("/another-mapping")或使用application.properties属性注释子类来实现spring.jersey.applicationPath.


关于你的第一个方法,看看泽西岛ServletProperties.您要配置的属性是FILTER_STATIC_CONTENT_REGEX.它指出:

仅当Jersey servlet容器配置为作为Filter运行时,该属性才适用,否则将忽略此属性

缺省时,Spring引导配置泽西servlet容器为一个Servlet(如提到这里):

默认情况下,Jersey将被设置为名为@Bean的类型的Servlet .您可以通过创建具有相同名称的bean来禁用或覆盖该bean.您也可以通过设置使用Filter而不是Servlet(在这种情况下,要替换或覆盖).ServletRegistrationBeanjerseyServletRegistrationspring.jersey.type=filter@BeanjerseyFilterRegistration

所以只需spring.jersey.type=filter在您的房产中设置属性即可application.properties.我测试了这个.

和FYI一样,无论是配置为Servlet过滤器还是Servlet,就Jersey来说,功能都是一样的.

顺便说一句,而不是使用FILTER_STATIC_CONTENT_REGEX,你需要设置一些复杂的正则表达式来处理所有静态文件,你可以使用FILTER_FORWARD_ON_404.这实际上是我以前测试的.我只是把它设置在我的ResourceConfig

@Component
public class JerseyConfig extends ResourceConfig {

    public JerseyConfig() {
        packages("...");
        property(ServletProperties.FILTER_FORWARD_ON_404, true);
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 请注意,生成的文件仍然存在问题.https://github.com/spring-projects/spring-boot/issues/2833跟踪进度. (2认同)