为了账号安全,请及时绑定邮箱和手机立即绑定

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

/ 猿问

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

天涯尽头无女友 2019-10-12 10:39:45

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


我想做的是获得我在运行中(在构建时)生成的文档作为欢迎页面。


我尝试了几种方法:


通过按照此处所述配置application.properties 适当的init参数,让Jersey提供静态内容

引入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.propertieswith,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 回答

?
慕标5265247

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


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


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


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


默认情况下,Jersey将以名为@Bean的类型设置为Servlet 。您可以通过创建自己的同名豆之一来禁用或覆盖该bean。您还可以通过设置使用过滤器而不是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);

    }

}


查看完整回答
反对 回复 2019-10-12
?
忽然笑

对于仍然无法使用它的人,我遵循了@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);

    }

}

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


查看完整回答
反对 回复 2019-10-12
?
慕森卡

以下设置对我有用



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


查看完整回答
反对 回复 2019-10-12

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信