今天又踩到一个烂坑,记录一下。
今天在写一个服务时,明明 request 的 url 没有问题,可就是服务掉不通。下面我来还原下我的坑:
代码如下:
package com.simonton.demo.controller;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;@RestController("/demo")public class DemoController { @RequestMapping("/hello") public String hello() { System.out.println("hello..."); return "hello String... "; }}
服务启动后,然后访问 /demo/hello 会显示404失败
分析:
明眼人一看,就知道是在controller类配置上出问题了, @restController("/demo") 配置的意思是当前的controller,spring会将其加载成一个具有@ResponseBody 能力的 controller,且该controller的 component 名为 “/demo”。
正确的配置应该是@RestContrller 和 @RequestMapping("/demo") 一起使用。
正确的代码如下:
package com.simonton.demo.controller;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;@RestController@RequestMapping("/demo")public class DemoController { @RequestMapping("/hello") public String hello() { System.out.println("hello..."); return "hello String... "; }}
总结:
其实对于@RestController 的滥用以前就遇到过,这个问题再次卡住长达半个小时,事实证明了,写代码不用脑子是很恐怖的。
提问:
对于 controller 层 @RestController 和 @RequestMapping 组合使用的概率极高。那么spring是否可以考虑组合这俩个annotation,出一个新的复合annotation,使之同时具备@Controller 和@RequestMapping的能力?