常见注解:
@Null 被注释的元素必须为 null
@NotNull 被注释的元素必须不为 null
@AssertTrue 被注释的元素必须为 true
@AssertFalse 被注释的元素必须为 false
@Min(value) 被注释的元素必须是一个数字,其值必须大于等于指定的最小值
@Max(value) 被注释的元素必须是一个数字,其值必须小于等于指定的最大值
@DecimalMin(value) 被注释的元素必须是一个数字,其值必须大于等于指定的最小值
@DecimalMax(value) 被注释的元素必须是一个数字,其值必须小于等于指定的最大值
@Size(max=, min=) 被注释的元素的大小必须在指定的范围内
@Digits (integer, fraction) 被注释的元素必须是一个数字,其值必须在可接受的范围内
@Past 被注释的元素必须是一个过去的日期
@Future 被注释的元素必须是一个将来的日期
@Pattern(regex=,flag=) 被注释的元素必须符合指定的正则表达式
Hibernate Validator 附加的 constraint
@NotBlank(message =) 验证字符串非null,且长度必须大于0
@Email 被注释的元素必须是电子邮箱地址
@Length(min=,max=) 被注释的字符串的大小必须在指定的范围内
@NotEmpty 被注释的字符串的必须非空
@Range(min=,max=,message=) 被注释的元素必须在合适的范围内
@NotBlank(message="年龄不能为空")
@Pattern(regexp="^[0-9]{1,2}$",message="年龄不正确")
private String age;
@AssertFalse(message = "必须为false")
private Boolean isFalse;
//如果是空,则不校验,如果不为空,则校验
@Pattern(regexp="^[0-9]{4}-[0-9]{2}-[0-9]{2}$",message="出生日期格式不正确")
private String birthday;
org.hibernate
hibernate-validator
6.1.0.Final
@Data
@AllArgsConstructor
@NoArgsConstructor
public class SimpleUser implements Serializable {
@NotNull(message = "id不能为空")
private Integer id;
@NotBlank(message = "用户名不能为空")
private String name;
}
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User implements Serializable {
@NotNull(message = "id不能为空")
private Integer id;
@NotBlank(message = "用户名不能为空")
private String name;
@Size(min = 6, max = 8, message = "密码必须是6-8位")
@NotNull(message = "密码不能为空")
private String password;
@Min(0)
@Max(200)
private Integer age;
@Email(message = "邮箱格式不正确")
@NotBlank(message = "邮箱不能为空")
private String email;
@NotNull(message = "列表不能为空")
private List<String> list;
@DecimalMin("0.0")
@DecimalMax("100.0")
@NotNull(message = "工资不能为空")
private Double salary;
@Valid //递归校验,如果是个对象,可以检验对象里的内容
@NotNull(message = "账户不能为空")
private Count count;
}
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Count implements Serializable {
@NotNull(message = "id不能为空")
private Integer id;
@NotBlank(message = "账户名不能为空")
private String countName;
@DecimalMin("0.0")
@DecimalMax("100.0")
private Double price;
}
@RestController
@Validated
public class TestController {
//BindingResult捕获错误
/**
* Get请求,检验简单对象
* @param user
* @param result
* @return
*/
@GetMapping("/test1")
public String test1(@Valid SimpleUser user, BindingResult result){
if(result.hasErrors()){
result.getAllErrors().forEach(objectError -> {
System.out.println(objectError.getDefaultMessage());
});
return "error";
}
return "test1......";
}
/**
* Post请求检验json串
* @param user
* @return
*/
@PostMapping("/test2")
public String test2(@RequestBody @Valid User user, BindingResult result){
System.out.println(user);
if(result.hasErrors()){
result.getAllErrors().forEach(objectError -> {
System.out.println(objectError.getDefaultMessage());
});
return "error2";
}
return "test2......";
}
/**
* 使用@RequestParam方式,@Valid无效,需要在Controller上加@Validated注解
* @param id
* @param name
* @param age
* @return
*/
@GetMapping("/test3")
public String test3(@RequestParam("id")Long id,
@RequestParam(value = "name",required = false)String name,
@Min(0) @Max (100) @RequestParam(value = "age",required = false)Integer age){
System.out.println(id);
System.out.println(name);
System.out.println(age);
return "test3......";
}
/**
* 通过全局异常捕获错误
* @param user
* @param
* @return
*/
@PostMapping("/test4")
public String test4(@RequestBody @Valid User user){
return "test4......";
}
}
/**
* 全局异常对参数校验异常进行捕获
*/
@RestControllerAdvice
public class GlobalException {
//可以返回ResponseModel,这只是测试返回字符串,到时可以自行封装
//ValidationException,顶层异常,可以进行捕获,ConstraintViolationException是子异常
@ExceptionHandler(ConstraintViolationException.class)
public String validationErrorHandler(ConstraintViolationException ce){
for (ConstraintViolation<?> violation : ce.getConstraintViolations()) {
String errorMsg = violation.getMessage();
System.out.println(errorMsg); //打印错误信息
}
return "globalException";
}
@ExceptionHandler(MethodArgumentNotValidException.class)
public String validateHandler(MethodArgumentNotValidException e){
BindingResult bindingResult = e.getBindingResult();
for (ObjectError error : bindingResult.getAllErrors()) {
System.out.println(error.getDefaultMessage()); //打印错误信息
}
return "error..." ;
}
}
3.1 普通模式,会获取所有校验错误信息
/**
* hibernate validator的配置类
*/
@Configuration
public class ValidatorConfiguration {
@Bean
public MethodValidationPostProcessor methodValidationPostProcessor() {
/**默认是普通模式,会返回所有的验证不通过信息集合*/
return new MethodValidationPostProcessor();
}
}
3.2 快速失败模式,只要出现检验错误就立即返回(企业级)
/**
* hibernate validator的配置类
*/
@Configuration
public class ValidatorConfiguration {
@Bean
public MethodValidationPostProcessor methodValidationPostProcessor() {
MethodValidationPostProcessor postProcessor = new MethodValidationPostProcessor();
/**设置validator模式为快速失败返回*/
postProcessor.setValidator(validator());
return postProcessor;
}
@Bean
public Validator validator(){
//false:则关闭,true:开启快速失败
ValidatorFactory validatorFactory = Validation.byProvider( HibernateValidator.class )
.configure()
.addProperty( "hibernate.validator.fail_fast", "true" )
.buildValidatorFactory();
Validator validator = validatorFactory.getValidator();
return validator;
}
}