Spring3支持JSR-303验证框架,JSR-303 是Java EE 6 中的一项子规范,叫做BeanValidation,官方参考实现是hibernate Validator(与Hibernate ORM 没有关系),JSR 303 用于对Java Bean 中的字段的值进行验证。
1. 表单属性
| 12
 3
 4
 5
 6
 
 | @Datapublic class User {
 
 @NotBlank(message = "name不能为空")
 private String name;
 }
 
 | 
2. Controller中开启验证
| 12
 3
 4
 5
 6
 7
 
 | import org.springframework.validation.annotation.Validated;
 @PostMapping("/register")
 public ResponseEntity<Void> register(@Validated User user) {
 
 return ResponseEntity.noContent().build();
 }
 
 | 
或者
| 12
 3
 4
 5
 6
 7
 
 | import javax.validation.Valid;
 @PostMapping("/register")
 public ResponseEntity<Void> register(@Valid User user) {
 
 return ResponseEntity.noContent().build();
 }
 
 | 
3. 处理异常
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 
 | @ExceptionHandler(MethodArgumentNotValidException.class)
 public ResponseEntity<String> handleValidException(MethodArgumentNotValidException e){
 
 return bindingResultToMsg(e.getBindingResult());
 }
 
 
 @ExceptionHandler(BindException.class)
 public ResponseEntity<String> handleValidException(BindException e){
 return bindingResultToMsg(e.getBindingResult());
 }
 private ResponseEntity<String> bindingResultToMsg(BindingResult result){
 
 List<ObjectError> errors = result.getAllErrors();
 StringBuffer errorMsg = new StringBuffer();
 errors.forEach(x -> errorMsg.append(x.getDefaultMessage()).append(";"));
 
 return ResponseEntity
 .status(200)
 .body(errorMsg.toString());
 }
 
 | 
4. 前端提交表单
针对 register(@Validated User user) 的表单提交,支持 Params 和 multipart/form-data ,不支持 Content-Type: application/json 的Body提交方式。
5. 支持Body提交
加上 @RequestBody 注解即可。
| 12
 3
 4
 5
 6
 7
 
 | import javax.validation.Valid;
 @PostMapping("/register")
 public ResponseEntity<Void> register(@RequestBody @Valid User user) {
 
 return ResponseEntity.noContent().build();
 }
 
 | 
完整校验注解
- @Length(min=, max=)	属性(String)	检查字符串长度是否符合范围	列长度会被设到最大值
- @Max(value=)	属性(以 numeric 或者 string 类型来表示一个数字)	检查值是否小于或等于最大值	对列增加一个检查约束
- @Min(value=)	属性(以 numeric 或者 string 类型来表示一个数字)	检查值是否大于或等于最小值	对列增加一个检查约束
- @NotNull	属性	检查值是否非空(not null)	
- @Past	属性(date 或 calendar)	检查日期是否是过去时	对列增加一个检查约束
- @Future	属性(date 或 calendar)	检查日期是否是将来时	
- @Pattern(regex=”regexp”, flag=)	属性(string)	检查属性是否与给定匹配标志的正则表达式相匹配(见 java.util.regex.Pattern )	
- @Range(min=, max=)	属性(以 numeric 或者 string 类型来表示一个数字)	检查值是否在最小和最大值之间(包括临界值)	对列增加一个检查约束
- @Size(min=, max=)	属性(array,collection,map)	检查元素大小是否在最小和最大值之间(包括临界值)
- @AssertFalse	属性	检查方法的演算结果是否为 false(对以代码方式而不是注解表示的约束很有用)
- @AssertTrue	属性	检查方法的演算结果是否为 true(对以代码方式而不是注解表示的约束很有用)
- @Valid		属性(object)	对关联对象递归进行验证。如果对象是集合或数组,就递归地验证其元素;如果对象是 Map,则递归验证其值元素
- @Email	属性(String)	检查字符串是否符合有效的 email
示例:
| 12
 3
 4
 5
 
 | @Size(max = 30, min = 4, message = "密码长度只能在4-30之间")private String password;// 密码
 
 @Pattern(regexp = "^1[35678]\\d{9}$",message = "手机号格式不正确")
 private String phone;// 电话
 
 |