Spring如何綁定請求參數或PathVariable參數綁定到對象,並作使用@Valid作JSR303校驗
###問題描述 之前在Spring中只對@RequestBody映射的請求參數使用過@Valid作JSR303校驗,RequestBody通常適用與Json或者Xml報文,若是是表單提交的參數(a=xxx&b=xxx),或者經過@PathVariable從url映射過來的參數就不懂得怎麼作校驗了。後來查閱官方文檔找到了實現方法。html
###解決方案 首先這裏仍是校驗那些把請求參數映射成事先定義好的參數對象,若是是要校驗直接映射成Controller方法的入參,目前還不知道如何實現(貌似校驗對象纔是JSR303標準?)。解決方式跟原來用@RequestBody方法仍是很相似的。java
- 實現定義好參數要映射的類,並加上校驗註解:
public class Param(){
@NotNull
private Sring paraA;
@NotNull
private Sring paraB;
//...seter,getter
}
- 而後在Controller中定義方法,用剛纔定義好的類做爲參數的映射對象,而後使用@ModelAttribute以及@Valid註解便可,下面介紹下普通的表單參數和@PathVariable參數的Controller方法寫法:
@RequestMapping(value = "/test") @ResponseBody public BaseJsonRsp test(@ModelAttribute @Valid Param param) { //doSomething } ```
@RequestMapping(value = "/test/{paraA}/{paraB}") @ResponseBody public BaseJsonRsp test(@PathVariable @Valid Param param) { //doSomething } ```
這樣http的請求參數就能夠自動映射道Param對象的同名字段中,並在進入Controller方法前,進行JSR303校驗。因爲這裏沒有在方法參數中定義BindResult參數,當參數校驗失敗時,會拋出BindExcetion異常(這裏不像@RequestBdoy拋出MethodArgumentNotValidException,但其實兩個異常內部都包含一個BindingResult對象保保存校驗結果),須要在Controller中定義帶@ExceptionHandler(BindExcetion.class)
的方法來統一這類處理異常。web
###參考spring
- StackOverFlow上相關的帖子:http://stackoverflow.com/questions/6203740/spring-web-mvc-validate-individual-request-params
- Spring API文檔中對@ModelAttribute 的說明:http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/bind/annotation/ModelAttribute.html