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.properties
和 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);
【问题讨论】:
能把你用过的配置贴出来吗? 刚刚添加了配置。 【参考方案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(在这种情况下,要替换或覆盖的@Bean
是jerseyFilterRegistration
)。
所以只需在您的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 发生冲突