文章目录
- 概念
- 基本概念
- 常用校验注解
- 前置内容
- 整合Hibernate Validator
- 快速入门
- 优雅处理参数校验异常
- 其余注解校验
- 自定义校验注解
- 参考来源
概念
基本概念
Hibernate Validator 是一个参数校验框架,可以非常方便地帮助我们校验应用程序的入参,实现了参数校验与业务开发的解耦
常用校验注解
- @Validated
通常作用于Controller的方法的对象参数上,标识该对象需要做参数校验 - @Valid
与@Validated注解功能类似,但它还可作用于要校验的对象参数的引用类型属性上,从而实现嵌套校验(即对要校验的对象参数的引用类型属性的属性做参数校验) - @NotNull
非空校验,但校验字符串时空字符串可验证通过 - @NotEmpty
非空校验,但校验字符串时纯空格字符串可验证通过 - @NotBlank
非空校验,校验字符串时纯空格字符串不可验证通过 - @Min
整数最小值校验 - @Max
整数最大值校验 - @Size
字符串、集合、数组长度校验 - @Email
邮箱格式校验 - @Pattern
使用正则表达式校验参数
前置内容
本教程基于Spring Boot快速整合Spring MVC和Mybatis-Plus,实现基本的增删改查功能这篇文章,请读者先阅读这篇文章
整合Hibernate Validator
快速入门
- 引入maven依赖
<!-- Hibernate Validator参数校验 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validation</artifactId></dependency>
- 在User类的nickname属性加上@NotBlank
@NotBlank(message = "昵称不能为空")private String nickname;
- 添加用户接口使用@valid注解
@PostMapping("/addUser")@ApiOperation(value = "添加用户")public boolean addUser(@RequestBody @Valid User user) {return userService.save(user);}
- 重启并使用Knife4j测试添加用户接口
如下图,控制台报了MethodArgumentNotValidException异常,并且响应提示也不友好,接下来我们需要全局处理一下该异常,让前端的提示更加友好
优雅处理参数校验异常
- 创建参数校验异常提示类
@Data
public class ValidErrorInfo {private String field;private String errMsg;
}
- 创建全局异常处理器
@RestControllerAdvice
@Slf4j
public class GlobalExceptionHandler {/*** 参数校验异常处理** @param e* @return*/@ExceptionHandler(MethodArgumentNotValidException.class) // 指定要处理的异常public List<ValidErrorInfo> handleMethodArgumentNotValidException(MethodArgumentNotValidException e) {// 打印异常信息log.error("参数校验异常", e);// 封装异常结果List<ValidErrorInfo> errs = new ArrayList<>();BindingResult bindingResult = e.getBindingResult();List<FieldError> fieldErrors = bindingResult.getFieldErrors();fieldErrors.forEach(err -> {ValidErrorInfo validErrorInfo = new ValidErrorInfo();validErrorInfo.setField(err.getField());validErrorInfo.setErrMsg(err.getDefaultMessage());errs.add(validErrorInfo);});return errs;}}
- 重启并使用Knife4j测试添加用户接口
响应结果输出了友好提示
其余注解校验
- 在User类的pwd属性加上@Size校验密码长度
@Size(min = 8, max = 16)private String pwd;
- 在User类的email属性加上@Email校验邮箱格式
@Emailprivate String email;
- 在User类的phone属性加上@Pattern校验手机号格式
@Pattern(regexp = "1([345789])\\d{9}")private String phone;
- 重启项目测试
- 其余注解请自行测试
自定义校验注解
如果现有的校验注解不能满足我们的需求,我们可以自定义校验注解,比如我们自定义一个性别校验注解
- 创建一个性别校验器
public class GenderValidValidator implements ConstraintValidator<GenderValid, String> {@Overridepublic boolean isValid(String value, ConstraintValidatorContext context) {List<String> genders = Arrays.asList("男", "女");return genders.contains(value);}
}
- 创建一个校验性别的校验注解
@Documented
@Constraint(validatedBy = {GenderValidValidator.class}) // 指定校验器
@Target({METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE})
@Retention(RUNTIME)
public @interface GenderValid {String message() default "性别录入必须为:男/女";Class<?>[] groups() default {};Class<? extends Payload>[] payload() default {};
}
- 在User类的gender属性加上 @GenderValid校验性别
- 重启项目测试
参考来源
- spring 官网
- hibernate-validator