Spring Boot集成Jetty与Jersey时静态资源服务及路径配置问题
问题1:src/main/static公开静态资源无法访问
这个问题通常是Jersey Servlet默认匹配根路径,覆盖了Spring MVC负责处理静态资源的Servlet导致的,两种解决方式可选:
- 开启Jersey 404转发配置:在application.properties中添加
spring.jersey.init.jersey.config.servlet.filter.forwardOn404=true,Jersey处理不了的请求会自动转发给后续的Spring MVC Servlet,静态资源就可以正常访问 - 直接给Jersey配置独立前缀(和第三个问题的解决方案联动),避免Jersey占用根路径匹配规则
问题2:私有静态资源目录配置
你可以直接复用Spring内置的静态资源处理能力,不需要自己实现资源读取、响应头设置等逻辑,修改后的代码如下:
@Bean public ServletRegistrationBean<HttpServlet> privateStaticContent() { DefaultServletHttpRequestHandler staticHandler = new DefaultServletHttpRequestHandler(); // 配置静态资源查找路径 staticHandler.setLocations(List.of(new ClassPathResource("private-static/"))); return new ServletRegistrationBean<>(new HttpServlet() { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { if (!isAuthenticated(req)) { resp.setStatus(HttpServletResponse.SC_UNAUTHORIZED); return; } // 身份校验通过后直接交给Spring静态资源处理器处理 staticHandler.handleRequest(req, resp); } }, "/private-static/*"); }
注意需要提前把src/main/private-static加入到项目的编译资源路径里,确保打包后会出现在classpath下。
问题3:Jersey单独配置访问前缀
Spring Boot原生支持仅对Jersey生效的路径前缀配置,两种方式任选即可:
- 配置文件方式:在application.properties中添加
spring.jersey.application-path=/api - 代码注解方式:在你的Jersey配置类(继承
ResourceConfig的类)上添加@ApplicationPath("/api")注解
两种方式都只会给Jersey接口添加/api前缀,不会影响其他自定义Servlet、静态资源的访问路径。
内容的提问来源于stack exchange,提问作者user2354302
相关产品推荐
相关产品推荐

