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

Posted

技术标签:

【中文标题】Spring-Boot Jersey:允许 Jersey 提供静态内容【英文标题】:Spring-Boot Jersey: allow Jersey to serve static content 【发布时间】:2015-06-21 21:17:12 【问题描述】:

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

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

我尝试了几种方法:

    让 Jersey 通过在 application.properties the proper init parameter 中进行配置来提供静态内容,如 here 所述 引入 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);
   

这里是 Spring Boot 应用程序类(我尝试添加一个 application.propertiesspring.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);
    

【问题讨论】:

能把你用过的配置贴出来吗? 刚刚添加了配置。 【参考方案1】:

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


关于您的第一种方法,请查看 Jersey ServletProperties。您尝试配置的属性是FILTER_STATIC_CONTENT_REGEX。它指出:

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

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

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

所以只需在您的application.properties 中设置属性spring.jersey.type=filter,它应该可以工作。我已经测试过了。

而且仅供参考,无论是配置为 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);
    

【讨论】:

嘿嘿,在阅读您的答案之前就这样做了,它有效! :) 请注意,生成的文件仍然存在问题。 github.com/spring-projects/spring-boot/issues/2833 跟踪进度。 @peeskillet 我只使用boot-starter-jersey和boot-starter-data,所以没有spring-mvc。他们的球衣终于在静态文件夹下提供了我的静态文件,但可以将/ 重定向到/index.html,顺便说一句,我使用嵌入 tomcat。 您还需要拥有 spring-boot-starter-web 才能提供静态内容。 这里真正的问题是,如果你使用 jersey starter,默认的 servlet 实现不是 DispatcherServlet(在我的例子中是 org.apache.catalina.servlets.DefaultServlet)所以如果你使用 jersey starter,整个MVN都没用。可能有可能以某种方式配置它,但我不知道如何配置。【参考方案2】:

对于仍然无法使其正常工作的任何人,我按照@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 的 sn-p。

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

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

【讨论】:

很高兴再次提到,为了使“property(ServletProperties.FILTER_FORWARD_ON_404, true);”工作,我们应该在“application.property”文件中添加“spring.jersey.type:filter”。【参考方案3】:

以下设置对我有用

设置

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

【讨论】:

这个尝试捕获什么样的异常?

以上是关于Spring-Boot Jersey:允许 Jersey 提供静态内容的主要内容,如果未能解决你的问题,请参考以下文章

为现有的 Jersey 项目从 Netbeans JPA 添加休眠

告诉我suit ,shirt,jacket ,jersey 有啥差别?谢谢

Hadoop Jersey 与 Wildfly resteasy 发生冲突

Spring Boot Jersey 和监控 URL

Jersey 中不允许的 405 方法正在返回 Tomcat 的 405 页面

Jersey 返回 HTTP 状态 405 - 不允许的方法