淺談@RequestMapping註解的註意點
@RequestMapping註解註意點
類上加沒加@RequestMappin註解區別
1.如果類上加瞭 @RequestMappin註解,那麼就會去該註解對應的路徑下去找頁面,如果沒有對應的頁面就會報錯。
舉例說明:
@RequestMapping("/user") public class UserController { @RequestMapping("/requestParam51") public String requestParam51(String[] name) { return "index.jsp"; } }
對應的跳轉頁面會去user目錄下去找,找不到就會報錯。
2.如果類上沒有加@RequestMapping註解,就會直接去根路徑下去找頁面
3.如果為跳轉的頁面加瞭"/",還是會去根路徑下去找對應的頁面。
舉例:
@RequestMapping("/user") public class UserController { @RequestMapping("/requestParam51") public String requestParam51(String[] name) { return "/index.jsp"; } }
@RequestMapping一個坑
今天發現瞭RequestMapping註解的一個坑:
當RequestMapping用於Class上時,不能用1.0,v1.0這樣帶小數點的value值做開頭
@Controller @RequestMapping(value = "/v1.0") public class TestController { @RequestMapping(value = "/a", method = RequestMethod.GET, produces = "application/json") public @ResponseBody Object getA() { return "{\"test\" : \"a\"}"; } @RequestMapping(value = "/b", method = RequestMethod.GET, produces = "application/json") public @ResponseBody Object getB() { return "{\"test\" : \"b\"}"; } }
如上代碼運行後,訪問http://localhost:port/v1.0/a 或者http://localhost:port/v1.0/b 時都會報錯:
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping#0': Invocation of init method failed; nested exception is java.lang.IllegalStateException: Ambiguous mapping found. Cannot map 'testController' bean method
public java.lang.Object com.my.test.controller.TestController.getB()
to {[/v1.0],methods=[GET],params=[],headers=[],consumes=[],produces=[application/json],custom=[]}: There is already 'testController' bean method
單看異常信息,還以為是有重名的路徑,結果搜遍瞭工程也沒找到重名的類,後來"v1.0"改成"v1",就正常運行瞭。
順帶測試瞭下,發現改成1.0也是同樣的錯誤。
之後再把一個方法上RequestMapping的value去掉,采用默認寫法:
@RequestMapping("/b") public @ResponseBody Object getB() { return "{\"test\" : \"b\"}"; }
再運行起來,訪問http://localhost:port/v1.0/a或者http://localhost:port/v1.0/b 就會變成404錯誤。
HTTP Status 404 - /v1.0/a type Status report message /v1.0/a description The requested resource is not available.
沒深究根本原因,估計是Spring的小bug,以後避免帶小數點的路徑頭。
以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。
推薦閱讀:
- Spring MVC數據綁定方式
- springboot RESTful以及參數註解的使用方式
- 聊聊@RequestMapping和@GetMapping @PostMapping的區別
- Spring Boot 控制層之參數傳遞方法詳解
- SpringMVC中Controller類數據響應的方法