SpringBoot中Hibernate-validator的使用

前言

Hibernate-validator可以让我们通过注解的方式在实体类中指定一些校验规则和默认的校验失败的错误信息。在SpringBoot中有两种方式可以实现Hibernate-validator校验实体类,一种是结合使用Srping的默认实现自动校验,一种是手动封装工具栏进行校验。

下面的例子都是基于SpringBoot2.0.5版本。

首先引入hibernate-validator的依赖:

<dependency>
    <groupId>org.hibernate.validatorgroupId>
    <artifactId>hibernate-validatorartifactId>
    <version>6.0.8.Finalversion>
dependency>

常用注解如下:

Constraint 详细信息
@Valid 被注释的元素是一个对象,需要检查此对象的所有字段值
@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(value) 被注释的元素必须符合指定的正则表达式
@Email 被注释的元素必须是电子邮箱地址
@Length 被注释的字符串的大小必须在指定的范围内
@NotEmpty 被注释的字符串的必须非空
@Range 被注释的元素必须在合适的范围内
@NotBlank 被注释的字符串的必须非空
@URL(protocol=,host=, port=,regexp=, flags=) 被注释的字符串必须是一个有效的url
@CreditCardNumber 被注释的字符串必须通过Luhn校验算法,银行卡,信用卡等号码一般都用Luhn计算合法性

现有User实体类,通过添加校验信息后代码如下:

/**
 * @author: Charviki
 * @create: 2019-10-05 22:21
 **/
public class User {

    private Long id;

    @NotBlank(message = "用户名不能为空!")
    @Length(min = 4, max = 30, message = "用户名只能在4~30位之间!")
    private String username;

    @NotBlank(message = "密码不能为空!")
    @Length(min = 8, message = "密码不能小于8位!")
    private String password;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}
使用@Valid注解

在Controller中方法参数User前加入@Valid注解,代码如下:

/**
 * @author: Charviki
 * @create: 2019-10-05 22:25
 **/
@RestController
@RequestMapping("/user")
public class UserController {

    @PostMapping
    public String register(@Valid User user){
        return "注册成功!";
    }
}

使用Postman进行测试:

校验不通过返回的默认信息格式如下:

SpringBoot中Hibernate-validator的使用_第1张图片

通过修改controller代码,自定义返回信息格式,修改后代码如下:

@PostMapping
public String register(@Valid User user, BindingResult result){
    if (result.hasErrors()){
        String errMsg = result.getFieldErrors().stream().map(e -> e.getDefaultMessage()).collect(Collectors.joining("|"));
        return errMsg;
    }
    return "注册成功!";
}

校验不通过是返回信息如下:

SpringBoot中Hibernate-validator的使用_第2张图片

通过工具类

封装校验结果类:

/**
 * @author: Charviki
 * @create: 2019-08-31 20:49
 **/

public class ValidationResult {
    /**
     * 校验结果是否有错
     */
    private boolean hasErrors = false;

    /**
     * 存放错误信息
     */
    private Map<String,String> errMsgMap = new HashMap<>();

    public String getErrMsg(){
        return StringUtils.join(errMsgMap.values().toArray(),",");
    }

    public boolean isHasErrors() {
        return hasErrors;
    }

    public void setHasErrors(boolean hasErrors) {
        this.hasErrors = hasErrors;
    }

    public Map<String, String> getErrMsgMap() {
        return errMsgMap;
    }

    public void setErrMsgMap(Map<String, String> errMsgMap) {
        this.errMsgMap = errMsgMap;
    }
}

校验工具类:

/**
 * @author: Charviki
 * @create: 2019-08-31 20:55
 **/
@Component
public class ValidatorImpl implements InitializingBean {

    private Validator validator;

    public ValidationResult validate(Object bean){
        ValidationResult result = new ValidationResult();

        // 通过已定义的注解进行校验
        Set<ConstraintViolation<Object>> constraintViolations = validator.validate(bean);

        if (constraintViolations.size() > 0){
            // 有错
            result.setHasErrors(true);
            constraintViolations.forEach(constraintViolation ->{
                String errMsg = constraintViolation.getMessage();
                String propertyName = constraintViolation.getPropertyPath().toString();
                result.getErrMsgMap().put(propertyName,errMsg);
            });
        }
        return result;
    }

    /**
     * 在bean初始化之后会回调该方法
     * @throws Exception
     */
    @Override
    public void afterPropertiesSet() throws Exception {
        // 将hibernate validator通过工厂的初始化方式使其实例化
        this.validator = Validation.buildDefaultValidatorFactory().getValidator();
    }
}

controller代码:

/**
 * @author: Charviki
 * @create: 2019-10-05 22:25
 **/
@RestController
@RequestMapping("/user")
public class UserController {

    @Autowired
    private ValidatorImpl validator;

    @PostMapping
    public String register(User user){
        ValidationResult validationResult = validator.validate(user);
        if (validationResult.isHasErrors()){
            return validationResult.getErrMsg();
        }
        return "注册成功!";
    }
}

校验不通过是返回信息如下:

SpringBoot中Hibernate-validator的使用_第3张图片

你可能感兴趣的:(SpringBoot)