SpringMVC
支持的數據校驗是JSR303
的標準,經過在bean
的屬性上打上@NotNull
、@Max
等進行驗證。JSR303
提供有不少annotation
接口,而SpringMVC
對於這些驗證是使用hibernate
的實現,因此咱們須要添加hibernate
的一個validator
包:java
compile 'javax.validation:validation-api:2.0.0.Final' compile 'org.hibernate:hibernate-validator:6.0.0.Final'
框架已經提供校驗以下:git
JSR提供的校驗註解: @Null 被註釋的元素必須爲 null @NotNull 被註釋的元素必須不爲 null,不能爲 null , 能夠爲 "" @AssertTrue 被註釋的元素必須爲 true @AssertFalse 被註釋的元素必須爲 false @Min(value) 被註釋的元素必須是一個數字,其值必須大於等於指定的最小值 @Max(value) 被註釋的元素必須是一個數字,其值必須小於等於指定的最大值 @DecimalMin(value) 被註釋的元素必須是一個數字,其值必須大於等於指定的最小值 @DecimalMax(value) 被註釋的元素必須是一個數字,其值必須小於等於指定的最大值 @Size(max=, min=) 驗證對象(Array,Collection,Map,String)長度是否在給定的範圍以內 @Digits (integer, fraction) 被註釋的元素必須是一個數字,其值必須在可接受的範圍內 @Past 被註釋的元素必須是一個過去的日期 @Future 被註釋的元素必須是一個未來的日期 @Pattern(regex=,flag=) 被註釋的元素必須符合指定的正則表達式 Hibernate Validator提供的校驗註解: @NotBlank(message =) 只能做用在String上,不能爲null,並且調用trim()後,長度必須大於0 @Email 被註釋的元素必須是電子郵箱地址 @Length(min=,max=) 被註釋的字符串的大小必須在指定的範圍內 @NotEmpty 被註釋的字符串的必須非空,不能爲 null、"",能夠爲 " " @Range(min=,max=,message=) 被註釋的元素必須在合適的範圍內
建立須要被校驗的實體類:web
package com.yiba.wifi.news.bean.model; import org.hibernate.validator.constraints.Length; import javax.validation.constraints.*; public class User { @NotBlank(message = "用戶名不能爲null,長度必須大於0") String name; //用戶名 @Min(value = 1, message = "最小年齡爲1歲") @Max(value = 120, message = "最大年齡爲120歲") Integer age; //年齡 @Email(message = "郵箱格式錯誤") @NotBlank(message = "郵箱格式錯誤") String email; //郵箱 @Length(min = 6, max = 12, message = "密碼長度必須在6位到12位之間") String pwd;//密碼 //get、set......... }
注意在校驗郵箱的時候,當 email 爲 "", 或者 null 的時候,會經過 @Email
驗證,因此郵箱校驗須要 @Email
和 @NotBlank
共同起做用。正則表達式
controller 接口設計,在參數接受的地方添加 @Validated
關鍵字spring
/** * 登陸接口 * @return */ @PostMapping("login") public String login(@Validated @RequestBody User user) { return "ok"; }
訪問測試:
當訪問數據是以下格式的時候api
{ "name": "", "age": 0, "email": "", "pwd": "" }
響應爲:微信
{ "timestamp": 1524640724522, "status": 400, "error": "Bad Request", "exception": "org.springframework.web.bind.MethodArgumentNotValidException", "errors": [ { "codes": [ "NotBlank.user.email", "NotBlank.email", "NotBlank.java.lang.String", "NotBlank" ], "arguments": [ { "codes": [ "user.email", "email" ], "arguments": null, "defaultMessage": "email", "code": "email" } ], "defaultMessage": "郵箱格式錯誤", "objectName": "user", "field": "email", "rejectedValue": "", "bindingFailure": false, "code": "NotBlank" }, { "codes": [ "NotBlank.user.name", "NotBlank.name", "NotBlank.java.lang.String", "NotBlank" ], "arguments": [ { "codes": [ "user.name", "name" ], "arguments": null, "defaultMessage": "name", "code": "name" } ], "defaultMessage": "用戶名不能爲null,長度必須大於0", "objectName": "user", "field": "name", "rejectedValue": "", "bindingFailure": false, "code": "NotBlank" }, { "codes": [ "Length.user.pwd", "Length.pwd", "Length.java.lang.String", "Length" ], "arguments": [ { "codes": [ "user.pwd", "pwd" ], "arguments": null, "defaultMessage": "pwd", "code": "pwd" }, 12, 6 ], "defaultMessage": "密碼長度必須在6位到12位之間", "objectName": "user", "field": "pwd", "rejectedValue": "", "bindingFailure": false, "code": "Length" }, { "codes": [ "Min.user.age", "Min.age", "Min.java.lang.Integer", "Min" ], "arguments": [ { "codes": [ "user.age", "age" ], "arguments": null, "defaultMessage": "age", "code": "age" }, 1 ], "defaultMessage": "最小年齡爲1歲", "objectName": "user", "field": "age", "rejectedValue": 0, "bindingFailure": false, "code": "Min" } ], "message": "Validation failed for object='user'. Error count: 4", "path": "/yiba/sms/login" }
能夠看到本地請求,4個字段校驗都沒經過,那麼我有沒有辦法獲取異常信息呢,答案是有的,須要咱們修改 controller 接口。app
/** * 登陸接口 * * @return */ @PostMapping("login") public String login(@Validated @RequestBody User user, BindingResult bindingResult) { if (bindingResult.hasErrors()) { //有校驗沒經過 List<ObjectError> errorList = bindingResult.getAllErrors(); for (ObjectError error : errorList) { System.out.println(error.getDefaultMessage()); //輸出具體的錯誤信息 } return "參數異常"; } return "ok"; }
再次請求,請求格式以下框架
{ "name": "", "age": 0, "email": "", "pwd": "" }
響應以下測試
參數異常
在控制檯打印的信息以下:
用戶名不能爲null,長度必須大於0 密碼長度必須在6位到12位之間 最小年齡爲1歲 郵箱格式錯誤
能夠看到咱們已經正常的獲取到了校驗信息了。
下面咱們來作一次參照正確的訪問:
請求參數以下:
{ "name": "zhaoyanjun", "age": 1, "email": "362299465@qq.com", "pwd": "123456" }
響應以下:
ok
控制檯什麼也沒輸出。
到這裏校驗已經講解完成了。
我的微信號:zhaoyanjun125 , 歡迎關注