You need to enable JavaScript to run this app. Spring Boot同时集成Jersey与Spring Web后@GetMapping接口无法访问问题
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 22:18:04