Spring Boot同时集成Jersey与Spring Web后@GetMapping接口无法访问问题
问题根因
你遇到的冲突本质是Jersey和Spring MVC默认会争抢同一个Servlet容器的请求调度权,当你同时引入两个starter且没有做特殊配置时,Spring Boot自动配置会优先让Jersey的Servlet接管所有请求,导致Spring MVC的DispatcherServlet收不到请求,自然识别不了@GetMapping的端点。
1. 两类端点的注册逻辑
Spring MVC 端点注册逻辑
- 引入
spring-boot-starter-web后,自动配置会初始化DispatcherServlet作为核心请求分发器,默认映射路径为/* - 扫描所有标注
@Controller/@RestController的Bean,解析类上和方法上的@RequestMapping/@GetMapping等注解,将路径和处理方法的映射关系注册到HandlerMapping中 - 收到请求时
DispatcherServlet根据路径匹配对应的处理方法执行
Jersey 端点注册逻辑
- 引入
spring-boot-starter-jersey后,自动配置会初始化JerseyServletContainer(本质也是Servlet实现),同时扫描标注@Path/@GET/@POST等JAX-RS注解的Bean,注册对应的请求映射 - 默认情况下Jersey的Servlet也会映射到
/*路径,优先级高于Spring MVC的DispatcherServlet
2. Spring MVC接口失效的具体原因
当两个Servlet都映射到/*路径时,Servlet容器会优先调用注册顺序更靠前的Servlet处理所有请求,Spring Boot自动配置中Jersey的Servlet注册优先级更高,所以所有请求都会先被Jersey接管:
- 路径匹配Jersey注册的端点(比如你的
/test)时直接处理返回 - 路径不匹配Jersey注册的端点时,Jersey会直接返回404,不会把请求转发给后面的Spring MVC DispatcherServlet,所以
/test2永远不会被Spring MVC处理
3. 解决方案
如果需要同时使用两类端点,只需要修改Jersey的默认映射路径,给它加一个专属前缀,避免覆盖所有请求:
方法1:通过配置文件修改
在application.properties/application.yml中添加配置:
# 给Jersey所有端点统一加/jersey前缀 spring.jersey.application-path=/jersey
修改后访问规则变为:
- Jersey端点:
http://localhost:8080/jersey/test - Spring MVC端点:
http://localhost:8080/test2
方法2:自定义Jersey配置类修改映射路径
你也可以在注册Jersey的ResourceConfig配置类中指定Servlet的映射路径,效果和配置文件一致。
内容的提问来源于stack exchange,提问作者Amit Gupta
相关产品推荐
相关产品推荐

