Spring Boot整合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校验性别
  • 重启项目测试
    在这里插入图片描述

参考来源

  • 21
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值