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

时间:2015-04-15 18:40:43

标签: java maven spring-boot jersey-2.0

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

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

我尝试了几种方法:

  1. 让泽西岛按照the proper init parameter
  2. 中的application.properties here配置静态内容
  3. 引入metadata-complete=false web.xml,以便将生成的HTML文档列为欢迎文件。
  4. 这些都没有成功。

    我想避免为了提供静态文件而启用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);
       }
    }
    

    这是Spring Boot应用程序类(我尝试使用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);
        }
    }
    

3 个答案:

答案 0 :(得分:28)

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


关于你的第一种方法,请看看泽西岛ServletProperties。您尝试配置的属性为FILTER_STATIC_CONTENT_REGEX。它声明:

  

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

Spring Boot默认将Jersey servlet容器配置为Servlet(如上所述here):

  

默认情况下,Jersey将被设置为名为@Bean的{​​{1}} ServletRegistrationBean类型的Servlet。您可以通过创建具有相同名称的bean来禁用或覆盖该bean。 您还可以通过设置jerseyServletRegistration 来使用过滤器而不是Servlet(在这种情况下,要替换或覆盖的spring.jersey.type=filter@Bean)。

因此,只需在jerseyFilterRegistration中设置属性spring.jersey.type=filter即可。我已对此进行了测试。

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

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

中进行设置
ResourceConfig

答案 1 :(得分:3)

对于仍然无法使用此功能的人,我按照@peeskillet提供的答案进行了更改。

以前我在Application.java创建了以下方法。

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

问题是这会注册/*路径的servlet,然后设置Jersey ResourceConfig配置文件。

删除上述方法后,将@Configuration注释放在我的ResourceConfig类上,我注意到可以通过Spring Boot检索静态资源。

为了完整性,这是我ResourceConfig的片段。

@Configuration
public class JerseyConfig extends ResourceConfig {
    public JerseyConfig() {
        // Application specific settings
        property(ServletProperties.FILTER_FORWARD_ON_404, true);
    }
}

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

答案 2 :(得分:0)

以下设置对我有用

设置

spring .jersey.type: filter

设置 FILTER_FORWARD_ON_404

@Configuration 
        public class MyResourceConfig extends ResourceConfig  {

            public MyResourceConfig () {
                try {
                    register(XXX.class);
                    property(ServletProperties.FILTER_FORWARD_ON_404, true);

                } catch (Exception e) {
                    LOGGER.error("Exception: ", e);                   
                }
            }       

        } 

注意:使用 @Configuration 代替 @component

相关问题