有時用SpringMVC的註解@PathVariable和@RequestParam接收頁面值的時候,會接收不到,會看到如下錯誤:
{ "msg":"Missing URI template variable 'noticeId' for method parameter of type int", "code":500 }
目前遇到的有兩種情況會導致出現上面的錯誤情況:
第一種:
頁面傳遞的參數名與方法的形參名不一致,此時註解不會把參數值傳遞給形參,只需要在註解後面加一個屬性就可以了,如:
<input id="userId" name="userId"></input>
此時可以用下面的方法:public User getUserById (@RequestParam(value = "userId") int id)
@PathVariable同理,這個標籤是直接從url取值然後傳入到形參。用法:
// 頁面鏈接:<a href="sys/notice/"+ item.noticeId></a>
URL:http://localhost:8080/sys/notice/1
對應的方法:
@GetMapping("{id}")
public ModelAndView getNoticeListByNoticeId(@PathVariable int id) {
ModelAndView mv = new ModelAndView("system/home/notice_detail");
mv.addObject("notice", noticeService.getNoticeListByNoticeId(id));
return mv;
}
第二種:
出現上面錯誤還有一種情況就是你請求的URL被改變了,如果上面@PathVariable的代碼變爲:// 頁面鏈接:<a href="sys/notice/"+ item.noticeId></a>
URL:http://localhost:8080/sys/notice/1
對應的方法:
@GetMapping("{noticeId}")
public ModelAndView getNoticeListByNoticeId(@PathVariable int noticeId) {
ModelAndView mv = new ModelAndView("system/home/notice_detail");
mv.addObject("notice", noticeService.getNoticeListByNoticeId(noticeId));
return mv;
}
這種情況下就會出現上面的問題,因爲我在寫的這個項目中有一個攔截器方法,此方法將路徑的所有大寫字母轉化爲小寫了,所以URL中的noticeId就會變爲noticeid,這樣一來就與形參名noticeId對應不上了,要改爲
@PathVariable(value="noticeid") int noticeId,因爲請求過來的頁面參數名已經轉換爲小寫了。