您的位置:

深入探究validation-api

一、validation api 自定义注解

在使用validation-api时,使用自定义注解可以更好的满足业务需求。在Java中,可以通过注解方式定义验证规则,然后通过validator对数据进行验证。

下面是一个自定义注解的示例:

public @interface Age {
    String message() default "年龄不符合要求";

    Class[] groups() default {};

    Class[] payload() default {};

    int maxAge() default 200;

    int minAge() default 0;
}

该自定义注解的作用是对年龄进行验证。通过maxAge和minAge定义了年龄的取值范围。

使用时,可以在实体类的属性上添加自定义注解:

public class User {

    @Age(minAge = 18, maxAge = 60, message = "年龄不符合要求")
    private Integer age;

    //其他属性和方法
}

使用validator进行验证时,如果年龄不在18到60的范围内,将会抛出ValidationException异常。

二、validation api 分组检验

在实际开发中,经常会遇到一种情况:同一实体类在不同场景下需要验证不同的属性。此时可以使用validation api的分组检验功能。

定义分组:

public interface UpdateGroup {
}

public interface AddGroup {
}

在实体类中使用注解指定分组:

public class User {

    @NotNull(groups = {AddGroup.class})
    private String username;

    @NotNull(groups = {AddGroup.class})
    private String password;

    @NotNull(groups = {UpdateGroup.class})
    private String nickname;

    //其他属性和方法
}

使用validator时指定检验分组:

Validator validator = Validation.buildDefaultValidatorFactory().getValidator();
Set
   > constraintViolationSet = validator.validate(user, AddGroup.class);

   
  

这样就只会检验AddGroup分组中的属性了,而UpdateGroup分组中的属性则不会被检验。

三、使用validator对数据进行验证

最常用的是使用validator对数据进行验证。下面是一个使用validator的示例代码:

public static  Map
    validate(T obj) {
    Map
     resultMap = new HashMap<>();
    Validator validator = Validation.buildDefaultValidatorFactory().getValidator();
    Set
     
      > constraintViolationSet = validator.validate(obj);
    if (constraintViolationSet != null && constraintViolationSet.size() > 0) {
        for (ConstraintViolation
       
        constraintViolation : constraintViolationSet) { resultMap.put(constraintViolation.getPropertyPath().toString(), constraintViolation.getMessage()); } } return resultMap; }
       
      
     
    
   
  

可以看到,这段代码中使用了buildDefaultValidatorFactory方法来获取默认的validator。获取到validator后,就可以对obj进行验证。

四、使用validation-api进行格式化输出

在验证数据时,常常需要给用户告知错误信息。通常情况下,错误信息都是非常简短的。为了更好的告知用户错误信息,validation-api提供了一种非常好的机制来格式化错误信息。

下面是一个使用validation-api对错误信息进行格式化的示例:

public static  String validateAndFormat(T obj) {
    Validator validator = Validation.buildDefaultValidatorFactory().getValidator();
    Set
   
    > constraintViolationSet = validator.validate(obj);
    if (constraintViolationSet != null && constraintViolationSet.size() > 0) {
        StringBuilder sb = new StringBuilder();
        for (ConstraintViolation constraintViolation : constraintViolationSet) {
            sb.append(constraintViolation.getPropertyPath()).append(":").append(constraintViolation.getMessage()).append(",");
        }
        sb.deleteCharAt(sb.length() - 1);
        return sb.toString();
    } else {
        return "";
    }
}

    
   
  

可以看到,这个方法首先使用validator.validate(obj)方法对数据进行验证,如果有错误信息,则用StringBuilder将错误信息格式化后返回。

五、使用validation-api进行快速验证

validation-api不仅提供了对实体对象的验证,还提供了对数据的快速验证。如果要验证数据是否满足某个规则,比如手机号码是否合法,就可以使用快速验证。

下面是一个使用validation-api进行快速验证的示例:

public static boolean isMobile(String str) {
    if (StringUtils.isBlank(str)) {
        return false;
    }
    Pattern pattern = Pattern.compile("^(13\\d|14[5|7]|15[0|1|2|3|4|5|6|7|8|9]|16[6]|17[0|1|2|3|4|5|6|7|8]|18\\d|19[8|9])\\d{8}$");
    Matcher matcher = pattern.matcher(str);
    return matcher.matches();
}

这里使用了正则表达式来验证手机号。

六、总结

本文围绕validation-api展开了多个方面的详细介绍,从自定义注解、分组检验、数据验证、格式化输出、快速验证等多个方面进行了详细的探究。通过本文的介绍可以看出,validation-api是一个非常强大的验证框架,能够在实际开发中大大提高我们的工作效率,减少开发出错的风险。