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

wnrlj8wa  于 5个月前  发布在  Spring
关注(0)|答案(4)|浏览(71)

该应用程序使用JDK 8,Sping Boot 和Sping Boot Jersey启动器,并打包为WAR(尽管它通过Sping Boot Maven插件在本地运行)。
我想做的是让我在飞行中(在构建时)生成的文档作为欢迎页面。
我尝试了几种方法:
1.通过在application.properties中配置正确的init参数,让Jersey提供静态内容,如here所述
1.引入metadata-complete=falseweb.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);
   }
}

字符串
这里是Sping 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);
    }
}

yh2wf1be

yh2wf1be1#

让我先声明一下,静态内容不会被提供的原因是因为Jersey servlet的默认servletMap,即/*,并占用了所有请求。因此,无法访问提供静态内容的默认servlet。除了下面的解决方案,另一种解决方案是简单地更改servletMap。您可以通过使用@ApplicationPath("/another-mapping")注解ResourceConfig子类或设置application.properties属性spring.jersey.applicationPath来实现这一点。
关于你的第一种方法,看看Jersey ServletProperties。你试图配置的属性是FILTER_STATIC_CONTENT_REGEX。它声明:
该属性仅在Jersey servlet容器配置为作为筛选器运行时适用,否则将忽略该属性
Sping Boot 默认情况下将Jersey servlet容器配置为Servlet(如此处所述):
默认情况下,Jersey将被设置为jerseyServletRegistration类型的@Bean中的Servlet。您可以通过创建一个同名的bean来禁用或覆盖该bean。**您还可以通过设置spring.jersey.type=filter**来使用Filter而不是Servlet(在这种情况下,要替换或覆盖的@BeanjerseyFilterRegistration)。
所以只要在你的application.properties中设置属性spring.jersey.type=filter,它就应该工作了。我已经测试过了。
仅供参考,无论是配置为Servlet过滤器还是Servlet,就Jersey而言,功能是相同的。
顺便说一句,如果你需要设置一些复杂的正则表达式来处理所有的静态文件,你可以使用FILTER_FORWARD_ON_404,而不是使用FILTER_STATIC_CONTENT_REGEX

@Component
public class JerseyConfig extends ResourceConfig {

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

字符串

esyap4oy

esyap4oy2#

对于那些仍然不能让这个工作的人,我遵循了@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类上,我注意到静态资源可以通过Sping Boot 检索。
为了完整起见,这是我的ResourceConfig的一个片段。

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


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

f1tvaqid

f1tvaqid3#

下面的设置为我工作

设置

spring .jersey.type: filter

字符串

setFILTER_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**

lzfw57am

lzfw57am4#

在我们的例子中,我们的项目完全基于jersey JAX-RS构建,所以我们不能将其用作过滤器,因为它会破坏整个项目。
spring-boot-starter-web添加到您的依赖项中,将spring MVC添加到您的classpath中。由于spring actuator构建在MVC上,因此您需要更改上下文路径。

server.servlet.context-path=/
spring.mvc.servlet.path=/management
spring.jersey.application-path=/

字符串
1.将web服务器(tomcat)servlet上下文路径设置为/
1.将spring mvc servlet路径设置为/management,这样你的actuator端点就变成了/management/actuator/health
1.像往常一样将jersey上下文设置为/,以使其他路由按原样工作
参考-https://docs.spring.io/spring-boot/docs/1.4.1.RELEASE/reference/html/howto-actuator.html

相关问题