Spring-Boot Jersey: allow Jersey to serve static content
Let me just first state, that the reason the static content won't be served is because of the default servlet mapping of the Jersey servlet, which is /*
, and hogs up all the requests. So the default servlet that serves the static content can't be reached. Beside the below solution, the other solution is to simply change the servlet mapping. You can do that by either annotating your ResourceConfig
subclass with @ApplicationPath("/another-mapping")
or set the application.properties
property spring.jersey.applicationPath
.
In regards to your first approach, take a look at the Jersey ServletProperties
. The property you are trying to configure is FILTER_STATIC_CONTENT_REGEX
. It states:
The property is only applicable when Jersey servlet container is configured to run as a Filter, otherwise this property will be ignored
Spring Boot by default configures the Jersey servlet container as a Servlet (as mentioned 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
).
So just set the property spring.jersey.type=filter
in your application.properties
, and it should work. I've tested this.
And FYI, whether configured as Servlet Filter or a Servlet, as far as Jersey is concerned, the functionality is the same.
As an aside, rather then using the FILTER_STATIC_CONTENT_REGEX
, where you need to set up some complex regex to handle all static files, you can use the FILTER_FORWARD_ON_404
. This is actually what I used to test. I just set it up in my ResourceConfig
@Component
public class JerseyConfig extends ResourceConfig {
public JerseyConfig() {
packages("...");
property(ServletProperties.FILTER_FORWARD_ON_404, true);
}
}
Below setup worked for me
Set
spring .jersey.type: filter
set 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);
}
}
}
Note: Use @Configuration instead of @component
For anyone who still can't get this to work, I followed the answer provided by @peeskillet, and had to make an additional change.
Previously I had created the following method in Application.java
.
@Bean
public ServletRegistrationBean jerseyServlet() {
ServletRegistrationBean registration = new ServletRegistrationBean(new ServletContainer(), "/*");
registration.addInitParameter(ServletProperties.JAXRS_APPLICATION_CLASS, JerseyConfig.class.getName());
return registration;
}
The problem is that this registered the servlet for the /*
path, and then setup the Jersey ResourceConfig
configuration file.
Once I removed the above method, and placed the @Configuration
annotation on my ResourceConfig
class, I noticed the static resource could be retrieved via Spring Boot.
For completeness, this is a snippet of my ResourceConfig
now.
@Configuration
public class JerseyConfig extends ResourceConfig {
public JerseyConfig() {
// Application specific settings
property(ServletProperties.FILTER_FORWARD_ON_404, true);
}
}
This blog post was helpful in determining the difference approach for the ResourceConfig
.