Spring3支持JSR-303验证框架,JSR-303 是Java EE 6 中的一项子规范,叫做BeanValidation,官方参考实现是hibernate Validator(与Hibernate ORM 没有关系),JSR 303 用于对Java Bean 中的字段的值进行验证。
1. 表单属性
1 2 3 4 5 6
| @Data public class User {
@NotBlank(message = "name不能为空") private String name; }
|
2. Controller中开启验证
1 2 3 4 5 6 7
| import org.springframework.validation.annotation.Validated;
@PostMapping("/register") public ResponseEntity<Void> register(@Validated User user) {
return ResponseEntity.noContent().build(); }
|
或者
1 2 3 4 5 6 7
| import javax.validation.Valid;
@PostMapping("/register") public ResponseEntity<Void> register(@Valid User user) {
return ResponseEntity.noContent().build(); }
|
3. 处理异常
1 2 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
注解即可。
1 2 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
示例:
1 2 3 4 5
| @Size(max = 30, min = 4, message = "密码长度只能在4-30之间") private String password;// 密码
@Pattern(regexp = "^1[35678]\\d{9}$",message = "手机号格式不正确") private String phone;// 电话
|