在工作中不可避免的要面对很多参数校验, 比如写新接口时需要对传入VO的必要字段进行校验, String 是否为空, Integer 最小值, 对象是否为null, 等等.
而使用 hibernate的validator工具对参数进行校验, 可以极大的简化流程, 当然不可避免的就是需要在被校验字段上加上注解信息.

1. 相关依赖
  1. <!-- 参数校验工具 -->
  2. <dependency>
  3. <groupId>org.hibernate</groupId>
  4. <artifactId>hibernate-validator</artifactId>
  5. <version>5.4.2.Final</version>
  6. </dependency>
  7. <dependency>
  8. <groupId>org.glassfish.web</groupId>
  9. <artifactId>el-impl</artifactId>
  10. <version>2.2</version>
  11. </dependency>

2. ValidationUtil

对加上相关注解字段进行校验, 使用到 ValidationUtil.javaValidationResult.java两个文件, 也可在工具中直接抛出异常.
ValidationUtil 内容如下:

  1. package com.liuzhihang.tool.validate;
  2. import org.apache.commons.collections.CollectionUtils;
  3. import javax.validation.ConstraintViolation;
  4. import javax.validation.Validation;
  5. import javax.validation.Validator;
  6. import java.beans.IntrospectionException;
  7. import java.beans.Introspector;
  8. import java.beans.PropertyDescriptor;
  9. import java.util.Set;
  10. /**
  11. * 对添加 hibernate.validator 注解的字段进行校验
  12. *
  13. * 使用前 需要引入 hibernate-validator 依赖
  14. *
  15. * @author liuzhihang
  16. * @date 2017/11/22 11:08
  17. */
  18. public class ValidationUtil {
  19. private static Validator validator = Validation.buildDefaultValidatorFactory().getValidator();
  20. /**
  21. * 会 验证 所有字段
  22. *
  23. * @param obj
  24. * @param <T>
  25. * @return 返回所有不符合的信息
  26. */
  27. public static <T> ValidationResult validateAllField(T obj) {
  28. ValidationResult result = new ValidationResult(true);
  29. StringBuilder errorMsg = new StringBuilder();
  30. if (obj == null) {
  31. result.setHasPass(false);
  32. result.setErrorMsg("The class is null!");
  33. return result;
  34. }
  35. Set<ConstraintViolation<T>> violationSet = validator.validate(obj);
  36. if (CollectionUtils.isNotEmpty(violationSet)) {
  37. for (ConstraintViolation<T> violation : violationSet) {
  38. errorMsg.append(violation.getMessage());
  39. }
  40. result.setHasPass(false);
  41. result.setErrorMsg(errorMsg.toString());
  42. }
  43. return result;
  44. }
  45. /**
  46. * 验证指定字段 是否符合信息
  47. *
  48. * @param obj
  49. * @param fieldName
  50. * @param <T>
  51. * @return
  52. */
  53. public static <T> ValidationResult validateOneField(T obj, String fieldName) {
  54. ValidationResult result = new ValidationResult(true);
  55. if (obj == null) {
  56. result.setHasPass(false);
  57. result.setErrorMsg("The class is null!");
  58. return result;
  59. }
  60. Set<ConstraintViolation<T>> violationSet = validator.validateProperty(obj, fieldName);
  61. if (CollectionUtils.isNotEmpty(violationSet)) {
  62. for (ConstraintViolation<T> violation : violationSet) {
  63. result.setHasPass(false);
  64. result.setErrorMsg(violation.getMessage());
  65. }
  66. }
  67. return result;
  68. }
  69. /**
  70. * 验证 所有字段, 当第一个不符合时 则直接返回信息
  71. *
  72. * @param obj
  73. * @param <T>
  74. * @return
  75. */
  76. public static <T> ValidationResult validateAllFieldForOneBack(T obj) {
  77. ValidationResult result = new ValidationResult(true);
  78. if (obj == null) {
  79. result.setHasPass(false);
  80. result.setErrorMsg("The class is null!");
  81. return result;
  82. }
  83. try {
  84. PropertyDescriptor[] propertyDescriptors = Introspector.getBeanInfo(obj.getClass()).getPropertyDescriptors();
  85. for (PropertyDescriptor propertyDescriptor : propertyDescriptors) {
  86. result = validateOneField(obj, propertyDescriptor.getName());
  87. if (result.getHasPass()) {
  88. return result;
  89. }
  90. }
  91. } catch (IntrospectionException e) {
  92. result.setHasPass(false);
  93. result.setErrorMsg("This validate has error : " + e);
  94. }
  95. return result;
  96. }
  97. }

ValidationResult 内容如下:

  1. package com.liuzhihang.tool.validate;
  2. /**
  3. * @Description:
  4. * @Author: liuzhihang
  5. * @Date: 2018/1/6 17:57
  6. */
  7. public class ValidationResult {
  8. private Boolean hasPass;
  9. private String errorMsg;
  10. public ValidationResult(Boolean hasPass) {
  11. this.hasPass = hasPass;
  12. }
  13. public Boolean getHasPass() {
  14. return hasPass;
  15. }
  16. public void setHasPass(Boolean hasPass) {
  17. this.hasPass = hasPass;
  18. }
  19. public String getErrorMsg() {
  20. return errorMsg;
  21. }
  22. public void setErrorMsg(String errorMsg) {
  23. this.errorMsg = errorMsg;
  24. }
  25. @Override
  26. public String toString() {
  27. return "ValidationResult{" +
  28. "hasPass=" + hasPass +
  29. ", errorMsg='" + errorMsg + '\'' +
  30. '}';
  31. }
  32. }

3. 常用注解
  1. Bean Validation 中内置的 constraint
  2. @Null 被注释的元素必须为 null
  3. @NotNull 被注释的元素必须不为 null
  4. @AssertTrue 被注释的元素必须为 true
  5. @AssertFalse 被注释的元素必须为 false
  6. @Min(value) 被注释的元素必须是一个数字,其值必须大于等于指定的最小值
  7. @Max(value) 被注释的元素必须是一个数字,其值必须小于等于指定的最大值
  8. @DecimalMin(value) 被注释的元素必须是一个数字,其值必须大于等于指定的最小值
  9. @DecimalMax(value) 被注释的元素必须是一个数字,其值必须小于等于指定的最大值
  10. @Size(max=, min=) 被注释的元素的大小必须在指定的范围内
  11. @Digits (integer, fraction) 被注释的元素必须是一个数字,其值必须在可接受的范围内
  12. @Past 被注释的元素必须是一个过去的日期
  13. @Future 被注释的元素必须是一个将来的日期
  14. @Pattern(regex=,flag=) 被注释的元素必须符合指定的正则表达式
  15. Hibernate Validator 附加的 constraint
  16. @NotBlank(message =) 验证字符串非null,且长度必须大于0
  17. @Email 被注释的元素必须是电子邮箱地址
  18. @Length(min=,max=) 被注释的字符串的大小必须在指定的范围内
  19. @NotEmpty 被注释的字符串的必须非空
  20. @Range(min=,max=,message=) 被注释的元素必须在合适的范围内

4 测试示例

代码:

  1. package com.liuzhihang.tool.validate;
  2. import lombok.Data;
  3. import org.hibernate.validator.constraints.NotBlank;
  4. import org.hibernate.validator.constraints.NotEmpty;
  5. import javax.validation.constraints.Min;
  6. import javax.validation.constraints.NotNull;
  7. /**
  8. * @author liuzhihang
  9. * @date 2017/11/22 18:25
  10. */
  11. @Data
  12. public class ValidationVo {
  13. @NotBlank(message = "The name must notEmpty!")
  14. private String name;
  15. @NotNull(message = "The age must notNull!")
  16. @Min(value = 1, message = "The age must greater than 0!")
  17. private Integer age;
  18. public static void main(String[] args) {
  19. ValidationVo validationVo = new ValidationVo();
  20. System.out.println(ValidationUtil.validateAllField(validationVo).toString());
  21. validationVo.setAge(1);
  22. System.out.println(ValidationUtil.validateAllField(validationVo).toString());
  23. validationVo.setName("二蛋");
  24. System.out.println(ValidationUtil.validateAllField(validationVo).toString());
  25. }
  26. }

输出结果:

  1. ValidationResult{hasPass=false, errorMsg='The name must notEmpty!The age must notNull!'}
  2. ValidationResult{hasPass=false, errorMsg='The name must notEmpty!'}
  3. ValidationResult{hasPass=true, errorMsg='null'}