文章目录
- 概念
- 基本概念
- 常用校验注解
- 前置内容
- 整合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校验邮箱格式
@Email
private String email;
- 在User类的phone属性加上@Pattern校验手机号格式
@Pattern(regexp = "1([345789])\\d{9}")
private String phone;
- 重启项目测试
- 其余注解请自行测试
自定义校验注解
如果现有的校验注解不能满足我们的需求,我们可以自定义校验注解,比如我们自定义一个性别校验注解
- 创建一个性别校验器
public class GenderValidValidator implements ConstraintValidator<GenderValid, String> {
@Override
public 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