咸鱼

咸鱼是以盐腌渍后,晒干的鱼

0%

SpringBoot注解@Validated表单校验

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
//@Validated校验的异常
@ExceptionHandler(MethodArgumentNotValidException.class)
public ResponseEntity<String> handleValidException(MethodArgumentNotValidException e){

return bindingResultToMsg(e.getBindingResult());
}

//@Valid校验的异常
@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) 的表单提交,支持 Paramsmultipart/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;// 电话