春季靴运动衫:允许球衣提供静态内容

2022-09-02 12:09:01

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

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

我尝试了几种方法:

  1. 让 Jersey 通过配置正确的 init 参数来提供静态内容,如此处所述application.properties
  2. 引入 a,以便将生成的 HTML 文档列为欢迎文件。metadata-complete=falseweb.xml

这些都没有成功。

我想避免启用Spring MVC或创建泽西岛资源只是为了提供静态文件。

有什么想法吗?

这是泽西岛配置类(我试图在那里添加一个失败):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应用程序类(我尝试添加一个with,但它不起作用,我不完全确定这里的属性键应该是什么):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

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


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

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

默认情况下,Spring Boot 将 Jersey Servlet 容器配置为 Servlet(如此处所述):

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

因此,只需在 中设置属性,它就可以工作了。我已经测试过了。spring.jersey.type=filterapplication.properties

仅供参考,无论配置为Servlet过滤器还是Servlet,就泽西岛而言,功能都是相同的。

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

@Component
public class JerseyConfig extends ResourceConfig {

    public JerseyConfig() {
        packages("...");
        property(ServletProperties.FILTER_FORWARD_ON_404, true);
    }
}

答案 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

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

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

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

这篇博客文章有助于确定 的差异方法。ResourceConfig


推荐