在springboot项目使用hibernate-validate对请求参数添加注解进行校验
常用注解
@Null
,标注的属性值必须为空
@NotNull
,标注的属性值不能为空
@AssertTrue
,标注的属性值必须为true
@AssertFalse
,标注的属性值必须为false
@Min
,标注的属性值不能小于min中指定的值
@Max
,标注的属性值不能大于max中指定的值
@DecimalMin
,小数值,同上
@DecimalMax
,小数值,同上
@Negative
,负数
@NegativeOrZero
,0或者负数
@Positive
,整数
@PositiveOrZero
,0或者整数
@Size
,指定字符串长度,注意是长度,有两个值,min以及max,用于指定最小以及最大长度
@Digits
,内容必须是数字
@Past
,时间必须是过去的时间
@PastOrPresent
,过去或者现在的时间
@Future
,将来的时间
@FutureOrPresent
,将来或者现在的时间
@Pattern
,用于指定一个正则表达式
@NotEmpty
,字符串内容非空
@NotBlank
,字符串内容非空且长度大于0
@Email
,邮箱
@Range
,用于指定数字,注意是数字的范围,有两个值,min以及max
使用方法
修改默认的验证策略
@Configuration
public class ValidatorConfig { @Bean
public Validator validator() {
ValidatorFactory factory = Validation.byProvider(HibernateValidator.class)
.configure()
//该配置的意思是,有一个验证失败就立刻返回,不用等到所有的都验证完
.addProperty("hibernate.validator.fail_fast", "true")
.buildValidatorFactory();
return factory.getValidator();
}
}
异常捕获
@RestControllerAdvice
public class GlobalExceptionHandler { //这里处理@RequestBody ,验证不通过抛出的异常
@ExceptionHandler(MethodArgumentNotValidException.class)
public ResultInfo<?> validationErrorHandler(MethodArgumentNotValidException ex) {
List<String> errorInformation = ex.getBindingResult().getAllErrors()
.stream()
.map(ObjectError::getDefaultMessage)
.collect(Collectors.toList());
return new ResultInfo<>(, errorInformation.get().toString(), null);
} //这里是处理 @PathVariable和@RequestParam 验证不通过抛出的异常
@ExceptionHandler(ConstraintViolationException.class)
public ResultInfo<?> validationErrorHandler(ConstraintViolationException ex) {
List<String> errorInformation = ex.getConstraintViolations()
.stream()
.map(ConstraintViolation::getMessage)
.collect(Collectors.toList());
return new ResultInfo<>(, errorInformation.toString(), null);
}
}
controller层
@RestController
@RequestMapping("/users")
@Validated
public class UserController { @PostMapping("/addUser")
public User addUser(@Valid @RequestBody User user) {
// 仅测试验证过程,省略其他的逻辑
return user;
} @GetMapping("/{name}/detail")
public User getUserByName(
@NotNull
@Size(min = , max = , message = "用户名格式有误")
@PathVariable String name) {
User user = new User();
user.setName(name);
return user;
} @GetMapping("/getName/detail")
public User getUserByNameParam(
@NotNull
@Size(min = , max = , message = "用户名格式有误")
@RequestParam("name") String name) {
User user = new User();
user.setName(name);
return user;
}
}