繁体   English   中英

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

[英]Spring-Boot Jersey: allow Jersey to serve static content

该应用程序使用 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);
   }
}

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

@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);
    }
}

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


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

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

春天开机默认配置了泽西servlet容器为一个Servlet(如提到这里):

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

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

而且仅供参考,无论配置为Servlet Filter还是Servlet,就Jersey而言,功能都是一样的。

FILTER_FORWARD_ON_404 ,而不是使用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);
    }
}

对于仍然无法使其正常工作的任何人,我遵循了@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配置文件。

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

为了完整起见,这是我的ResourceConfig现在的一个片段。

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

这篇博文有助于确定ResourceConfig的不同方法。

以下设置对我有用

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM