一、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 staticMap 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 staticString 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是一个非常强大的验证框架,能够在实际开发中大大提高我们的工作效率,减少开发出错的风险。