Spring-Boot Jersey:允许 Jersey 提供静态内容
Spring-Boot Jersey: allow Jersey to serve static content
该应用程序使用 JDK 8, Spring Boot & Spring Boot Jersey starter 并打包为 WAR(尽管它是本地 运行通过 Spring Boot Maven 插件)。
我想做的是获取我动态生成的文档(在构建时)作为欢迎页面。
我尝试了几种方法:
- 通过在
application.properties
the proper init parameter as described here 中配置让 Jersey 提供静态内容
- 引入
metadata-complete=false
web.xml
以便将生成的 HTML 文档列为欢迎文件。
None 个结果。
我想避免必须启用 Spring MVC 或创建仅用于提供静态文件的 Jersey 资源。
有什么想法吗?
这是 Jersey 配置 class(我尝试在其中添加 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 引导应用程序 class(我尝试添加一个 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);
}
}
首先让我声明,静态内容无法提供的原因是 Jersey servlet 的默认 servlet 映射 /*
,它占用了所有请求。因此无法访问为静态内容提供服务的默认 servlet。除了下面的解决方案,另一个解决方案是简单地更改 servlet 映射。您可以通过使用 @ApplicationPath("/another-mapping")
注释 ResourceConfig
子类或设置 application.properties
属性 spring.jersey.applicationPath
.
来做到这一点
关于您的第一种方法,请查看球衣 ServletProperties
. The property you are trying to configure is FILTER_STATIC_CONTENT_REGEX
。它指出:
The property is only applicable when Jersey servlet container is configured to run as a Filter, otherwise this property will be ignored
Spring 默认情况下引导将 Jersey servlet 容器配置为 Servlet(如前所述 here):
By default Jersey will be set up as a Servlet in a @Bean
of type ServletRegistrationBean
named jerseyServletRegistration
. You can disable or override that bean by creating one of your own with the same name. You can also use a Filter instead of a Servlet by setting spring.jersey.type=filter
(in which case the @Bean
to replace or override is jerseyFilterRegistration
).
所以只需在您的 application.properties
中设置 属性 spring.jersey.type=filter
,它应该可以工作。我已经测试过了。
仅供参考,无论是配置为 Servlet Filter 还是 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);
}
}
对于仍然无法使其正常工作的任何人,我遵循了@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
class 上,我注意到静态资源可以通过 Spring Boot 检索。
为了完整起见,这是我现在 ResourceConfig
的片段。
@Configuration
public class JerseyConfig extends ResourceConfig {
public JerseyConfig() {
// Application specific settings
property(ServletProperties.FILTER_FORWARD_ON_404, true);
}
}
This blog post 有助于确定 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
该应用程序使用 JDK 8, Spring Boot & Spring Boot Jersey starter 并打包为 WAR(尽管它是本地 运行通过 Spring Boot Maven 插件)。
我想做的是获取我动态生成的文档(在构建时)作为欢迎页面。
我尝试了几种方法:
- 通过在
application.properties
the proper init parameter as described here 中配置让 Jersey 提供静态内容
- 引入
metadata-complete=false
web.xml
以便将生成的 HTML 文档列为欢迎文件。
None 个结果。
我想避免必须启用 Spring MVC 或创建仅用于提供静态文件的 Jersey 资源。
有什么想法吗?
这是 Jersey 配置 class(我尝试在其中添加 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 引导应用程序 class(我尝试添加一个 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);
}
}
首先让我声明,静态内容无法提供的原因是 Jersey servlet 的默认 servlet 映射 /*
,它占用了所有请求。因此无法访问为静态内容提供服务的默认 servlet。除了下面的解决方案,另一个解决方案是简单地更改 servlet 映射。您可以通过使用 @ApplicationPath("/another-mapping")
注释 ResourceConfig
子类或设置 application.properties
属性 spring.jersey.applicationPath
.
关于您的第一种方法,请查看球衣 ServletProperties
. The property you are trying to configure is FILTER_STATIC_CONTENT_REGEX
。它指出:
The property is only applicable when Jersey servlet container is configured to run as a Filter, otherwise this property will be ignored
Spring 默认情况下引导将 Jersey servlet 容器配置为 Servlet(如前所述 here):
By default Jersey will be set up as a Servlet in a
@Bean
of typeServletRegistrationBean
namedjerseyServletRegistration
. You can disable or override that bean by creating one of your own with the same name. You can also use a Filter instead of a Servlet by settingspring.jersey.type=filter
(in which case the@Bean
to replace or override isjerseyFilterRegistration
).
所以只需在您的 application.properties
中设置 属性 spring.jersey.type=filter
,它应该可以工作。我已经测试过了。
仅供参考,无论是配置为 Servlet Filter 还是 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);
}
}
对于仍然无法使其正常工作的任何人,我遵循了@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
class 上,我注意到静态资源可以通过 Spring Boot 检索。
为了完整起见,这是我现在 ResourceConfig
的片段。
@Configuration
public class JerseyConfig extends ResourceConfig {
public JerseyConfig() {
// Application specific settings
property(ServletProperties.FILTER_FORWARD_ON_404, true);
}
}
This blog post 有助于确定 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