SpringBoot中如何兼容Jersey与Spring MVC实现平滑过渡?
实现Jersey与Spring MVC的默认路由兼容方案
核心思路
让Jersey占据根路径(/)作为默认路由入口,当Jersey无法匹配请求路径时,自动将请求转发给Spring MVC处理。这种方式既能完全保留原有Jersey端点的URL不变,又能最小化对新MVC端点路径的侵入性。
具体配置步骤
1. 调整Jersey配置,移除路径前缀
删除Jersey配置类上的@ApplicationPath注解,让Jersey默认处理根路径下的所有请求:
@Configuration class JerseyConfig extends ResourceConfig { public JerseyConfig() { // 注册你的Jersey资源类所在包 packages("com.your.project.jersey.resources"); } }
2. 配置Servlet优先级与映射
在SpringBoot配置文件(application.properties或application.yml)中,调整DispatcherServlet和Jersey Servlet的加载优先级与映射规则:
# 让Spring MVC的DispatcherServlet映射所有路径,但设置Jersey优先加载 spring.mvc.servlet.path=/* spring.jersey.servlet.load-on-startup=1
YAML格式:
spring: mvc: servlet: path: /* jersey: servlet: load-on-startup: 1
3. 添加Jersey转MVC的转发过滤器
自定义Jersey响应过滤器,当Jersey返回404时,触发请求转发到Spring MVC:
@Provider public class MvcForwardFilter implements ContainerResponseFilter { @Override public void filter(ContainerRequestContext requestCtx, ContainerResponseContext responseCtx) throws IOException { // 检测到Jersey无法匹配路径返回404时,开启转发 if (responseCtx.getStatus() == 404) { requestCtx.setProperty("jersey.config.servlet.forwardOn404", true); } } }
将过滤器注册到Jersey配置中:
@Configuration class JerseyConfig extends ResourceConfig { public JerseyConfig() { packages("com.your.project.jersey.resources"); register(MvcForwardFilter.class); } }
验证逻辑
- 访问原有Jersey端点URL(如
/users/1):Jersey直接匹配并处理请求,完全保留原有路径。 - 访问新的Spring MVC端点URL(如
/new-orders/list):Jersey无法匹配该路径,返回404后触发转发,由Spring MVC接手处理。
该方案完全满足你的三个需求:
- 同时保留Jersey与MVC端点
- Jersey端点URL无任何改动
- 新MVC端点无需强制添加前缀(可根据业务需求自由定义路径)
内容的提问来源于stack exchange,提问作者diziaq
相关产品推荐
相关产品推荐

