Spring Rest中@RestController指定路径引发No adapter for handler错误排查
嘿,这个问题其实是对@RestController注解的参数理解偏差导致的,我来给你掰扯清楚:
1. 先搞懂@RestController的value属性到底是干啥的
很多人会误以为@RestController的value是用来设置请求路径前缀的,但**完全不是!**它的value属性本质是给这个控制器对应的Spring Bean指定一个名称,和请求路径半毛钱关系都没有。真正用来设置类级别路径前缀的是@RequestMapping(或者它的派生注解,比如@GetMapping、@PostMapping等)。
2. 第一段代码为啥能正常运行
第一段代码里,@RestController没指定value,Spring会自动给这个控制器Bean生成一个默认名称,同时类本身没有设置任何路径前缀。这时候方法上的@GetMapping("/test")就直接把请求路径/test和这个方法绑定了,DispatcherServlet能正常找到对应的处理器和适配器,所以返回10完全没问题。
3. 第二段代码报错的核心原因
你写的@RestController("/test"),其实只是把这个控制器Bean的名称改成了/test,根本没有给类添加路径前缀。而方法上的@GetMapping又没指定路径,这时候Spring没办法正确解析这个方法的请求映射——因为类级别没有有效的路径映射配置,方法也没有明确的路径,导致DispatcherServlet找不到合适的HandlerAdapter来处理这个请求,所以就抛出了那个“No adapter for handler”的错误。
4. 正确的写法(实现你想要的路径前缀效果)
如果想给控制器下所有方法加/test的路径前缀,应该用类级别的@RequestMapping(或者@GetMapping)来配置,比如:
@RestController @RequestMapping("/test") public class TestController { @GetMapping public int test() { return 10; } }
这样类级别的@RequestMapping("/test")会作为所有方法的路径前缀,方法上的@GetMapping就会映射到/test路径,请求就能正常处理啦。
内容的提问来源于stack exchange,提问作者john

