JSR303通用验证类

男娘i 2022-05-24 06:48 385阅读 0赞

JSR303是JAVA EE6中的子规范。

用于对Java Bean的字段值进行校验,确保输入进来的数据在语义上是正确的,使验证逻辑从业务代码中脱离出来。

JSR303是运行时数据验证框架,验证之后验证的错误信息会马上返回。

有两个版本JSR303(BeanValidation1.0)和JSR349(BeanValidation1.1)。

由于之前使用的框架是structs2,没有使用springMvc没办法直接用注解,所以写了一个通用验证工具类,有其他好的验证建议可以写评论一起交流,以下是具体用法:

1.BeanValidatorUtils(必要)

  1. import java.util.ArrayList;
  2. import java.util.Arrays;
  3. import java.util.HashMap;
  4. import java.util.List;
  5. import java.util.Map;
  6. import java.util.Set;
  7. import javax.validation.ConstraintViolation;
  8. import javax.validation.ConstraintViolationException;
  9. import javax.validation.Validation;
  10. import javax.validation.Validator;
  11. import org.hibernate.validator.HibernateValidator;
  12. import org.hibernate.validator.messageinterpolation.ResourceBundleMessageInterpolator;
  13. import org.hibernate.validator.resourceloading.AggregateResourceBundleLocator;
  14. /**
  15. * 通用验证处理方法 工具类,符合JSR303验证规范,内部采用Hibernate Validator实现
  16. */
  17. public class BeanValidatorUtils {
  18. /** 存放错误信息的properties数组 */
  19. public static final List<String> VALIDATION_MESSAGES = Arrays.asList("validationMessage");
  20. /** 错误消息分隔符 */
  21. public static final String SEPARATOR = "<br>";
  22. /**
  23. * 使用hibernate的注解来进行验证 .failFast(true)遇到错误立即报错
  24. */
  25. private static Validator validator = Validation.byProvider(HibernateValidator.class).configure()
  26. .messageInterpolator(
  27. new ResourceBundleMessageInterpolator(new AggregateResourceBundleLocator(VALIDATION_MESSAGES)))
  28. .buildValidatorFactory().getValidator();
  29. /**
  30. * 调用JSR303的validate方法, 验证失败时返回错误信息列表
  31. *
  32. * @param bean
  33. * 要验证的JavaBean
  34. * @param groups
  35. * 验证分组
  36. * @return 错误信息列表
  37. */
  38. public static <T> List<String> validateListResult(T bean, Class<?>... groups) {
  39. List<String> errorMessages = new ArrayList<String>();
  40. Set<ConstraintViolation<T>> constraintViolations = validator.validate(bean, groups);
  41. // 抛出检验异常
  42. if (constraintViolations.size() > 0) {
  43. for (ConstraintViolation<T> violation : constraintViolations) {
  44. errorMessages.add(violation.getMessage());
  45. }
  46. }
  47. return errorMessages;
  48. }
  49. /**
  50. * 调用JSR303的validate方法, 验证失败时返回错误信息Map
  51. *
  52. * @param bean
  53. * 要验证的JavaBean
  54. * @param groups
  55. * 验证分组
  56. * @return 错误信息列表
  57. */
  58. public static <T> Map<String, String> validateMapResult(T bean, Class<?>... groups) {
  59. Map<String, String> errorMessages = new HashMap<String, String>();
  60. Set<ConstraintViolation<T>> constraintViolations = validator.validate(bean, groups);
  61. // 抛出检验异常
  62. if (constraintViolations.size() > 0) {
  63. for (ConstraintViolation<T> violation : constraintViolations) {
  64. errorMessages.put(violation.getPropertyPath().toString(), violation.getMessage());
  65. }
  66. }
  67. return errorMessages;
  68. }
  69. /**
  70. * 调用JSR303的validate方法, 验证失败时抛出ConstraintViolationException.
  71. *
  72. * @param bean
  73. * 要验证的JavaBean
  74. * @param groups
  75. * 验证分组
  76. *
  77. */
  78. public static void validateWithException(Object bean, Class<?>... groups) throws ConstraintViolationException {
  79. Set<? extends ConstraintViolation<?>> constraintViolations = validator.validate(bean, groups);
  80. if (constraintViolations.size() > 0) {
  81. // 错误信息以异常的 形式抛出可通过e.getConstraintViolations()方法获取具体验证信息
  82. throw new ConstraintViolationException(constraintViolations);
  83. }
  84. }
  85. /**
  86. * 内部转换方法,将错误信息List转换成String
  87. *
  88. * @param errorList
  89. * 将错误信息List
  90. * @return 错误信息
  91. */
  92. public static String validateListToString(List<String> errorList) {
  93. StringBuffer strBuffer = new StringBuffer();
  94. for (String error : errorList) {
  95. strBuffer.append(error);
  96. strBuffer.append(SEPARATOR);
  97. }
  98. return strBuffer.toString();
  99. }
  100. }

2.ValidatorGroup(一个JavaBean满足不同验证规则时使用,可选)

  1. /**
  2. * 通用验证分组,可根据需求增加接口即可
  3. */
  4. public interface ValidatorGroup {
  5. /**
  6. * 保存验证分组
  7. */
  8. public static interface Save {
  9. }
  10. /**
  11. * 插入验证分组
  12. */
  13. public static interface Insert {
  14. }
  15. /**
  16. * 查询验证分组
  17. */
  18. public static interface Query {
  19. }
  20. /**
  21. * 删除验证分组
  22. */
  23. public static interface Delete {
  24. }
  25. /**
  26. * 更新验证分组
  27. */
  28. public static interface Update {
  29. }
  30. }

3.classpath下 validationMessage.properties(通用的验证提示信息,可选)

  1. validator.required=是必填字段
  2. validator.length=需要控制在
  3. validator.engnum=只能包含大小写英文以和下划线

4.pom.xml

  1. <dependency>
  2. <groupId>javax.validation</groupId>
  3. <artifactId>validation-api</artifactId>
  4. <version>2.0.1.Final</version>
  5. </dependency>
  6. <dependency>
  7. <groupId>org.hibernate</groupId>
  8. <artifactId>hibernate-validator</artifactId>
  9. <version>6.0.8.Final</version>
  10. </dependency>
  11. <dependency>
  12. <groupId>javax.el</groupId>
  13. <artifactId>javax.el-api</artifactId>
  14. <version>3.0.0</version>
  15. </dependency>

BeanValidatorUtils 内方法介绍

内部转换方法,将错误信息List转换成String

String strList = BeanValidatorUtils. validateListToString(errorList);

调用通用验证方法取得验证后的错误信息列表, 可传递多个验证分组(可选)

List strList = BeanValidatorUtils. validateListResult(validatorBean ,group…);

调用通用验证方法取得验证后的错误信息Map , 可传递多个验证分组(可选)

Map = BeanValidatorUtils. validateMapResult(validatorBean ,group… );

调用通用验证方法, 验证失败时抛出ConstraintViolationException , 可传递多个验证分组(可选)

BeanValidatorUtils. validateWithException(validatorBean ,group… );

使用方法

一,首先要按照JSR303验证规范,写好需要验证的JavaBean,例如

70

例子

  1. //需要验证的JavaBean
  2. ValidatorBean validatorBean = new ValidatorBean();
  3. //调用通用验证方法取得验证后的错误信息列表
  4. List<String> strList = BeanValidatorUtils.validateListResult(validatorBean);
  5. //如果有错误则抛出异常
  6. if(strList.size()>0){
  7. //将错误信息列表转化成字符串
  8. String error = BeanValidatorUtils.validateListToString(strList);
  9. System.out.println(error);
  10. }

发表评论

表情:
评论列表 (有 0 条评论,385人围观)

还没有评论,来说两句吧...

相关阅读

    相关 JSR-303

    请求参数的校验是很多新手开发非常容易犯错,或存在较多改进点的常见场景。比较常见的问题主要表现在以下几个方面: 仅依靠前端框架解决参数校验,缺失服务端的校验。这种情况常见

    相关 JSR303通用验证

    JSR303是JAVA EE6中的子规范。 用于对Java Bean的字段值进行校验,确保输入进来的数据在语义上是正确的,使验证逻辑从业务代码中脱离出来。 JSR303是运