Spring Boot中如何让单个方法忽略类上定义的RequestMapping路径
控制器方法忽略类级别@RequestMapping前缀的实现方案
注意:
@RestController注解本身已经包含@Controller和@ResponseBody的语义,不需要重复标注@Controller注解。
方案1:拆分控制器(无版本依赖,最稳妥)
将需要独立路径的接口单独抽离到无公共前缀的控制器类中,符合单一职责原则,实现成本最低:
// 原有带公共前缀的用户控制器 @RestController @RequestMapping("/api/user/") public class UserResource { @GetMapping("{userId}") public User user(@PathVariable("userId") String userId) { // 执行业务逻辑 return new User(); } } // 单独定义无公共前缀的V2版本控制器 @RestController public class UserV2Resource { @GetMapping("/api/v2/user/{userId}") public UserData userV2(@PathVariable("userId") String userId) { // 执行业务逻辑 return new UserData(); } }
方案2:SpEL表达式实现同控制器忽略前缀(适配全Spring版本)
不需要拆分控制器,在需要独立路径的方法的请求映射路径前拼接SpEL空字符串表达式,Spring解析后会自动识别为根路径,跳过类前缀拼接:
@RestController @RequestMapping("/api/user/") public class UserResource { @GetMapping("{userId}") public User user(@PathVariable("userId") String userId) { // 执行业务逻辑 return new User(); } // 路径前加 #{''} 标识从根路径匹配,忽略类上的公共前缀 @GetMapping("#{''}/api/v2/user/{userId}") public UserData userV2(@PathVariable("userId") String userId) { // 执行业务逻辑 return new UserData(); } }
方案3:Spring 5.1+ 原生绝对路径支持
如果使用Spring 5.1及以上版本(对应Spring Boot 2.1及以上版本),开启绝对路径配置后,方法上以/开头的路径会自动忽略类前缀:
- 新增Web配置开启绝对路径支持:
@Configuration public class WebConfig implements WebMvcConfigurer { @Override public void configurePathMatch(PathMatchConfigurer configurer) { // 开启方法级绝对路径匹配支持 configurer.setUseRegisteredSuffixPatternMatch(true); } }
- 方法路径直接以
/开头即可:
@GetMapping("/api/v2/user/{userId}") public UserData userV2(@PathVariable("userId") String userId) { // 执行业务逻辑 return new UserData(); }
内容的提问来源于stack exchange,提问作者ToenshoffR
相关产品推荐
相关产品推荐

