From f741f5317b7f5868eec231d494166a0308edcbe2 Mon Sep 17 00:00:00 2001 From: Looly Date: Sun, 8 Nov 2020 17:48:42 +0800 Subject: [PATCH] add ValidationUtil --- CHANGELOG.md | 3 +- hutool-extra/pom.xml | 34 ++++++++------- .../validation/BeanValidationResult.java | 36 +++++++++++++--- ...alidationUtil.java => ValidationUtil.java} | 42 +++++++++++-------- .../hutool/extra/validation/package-info.java | 2 +- .../validation/BeanValidatorUtilTest.java | 12 +++--- 6 files changed, 85 insertions(+), 44 deletions(-) rename hutool-extra/src/main/java/cn/hutool/extra/validation/{BeanValidationUtil.java => ValidationUtil.java} (76%) diff --git a/CHANGELOG.md b/CHANGELOG.md index 385395f85..dd625227d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,11 +3,12 @@ ------------------------------------------------------------------------------------------------------------- -# 5.4.8 (2020-11-03) +# 5.5.0 (2020-11-08) ### 新特性 * 【core 】 NumberUtil.parseInt等支持123,2.00这类数字(issue#I23ORQ@Gitee) * 【core 】 增加ArrayUtil.isSub、indexOfSub、lastIndexOfSub方法(issue#I23O1K@Gitee) +* 【extra 】 增加ValidationUtil(pr#207@Gitee) ### Bug修复 * 【core 】 修复DateUtil.current使用System.nanoTime的问题(issue#1198@Github) diff --git a/hutool-extra/pom.xml b/hutool-extra/pom.xml index 90234912f..49c308cb6 100644 --- a/hutool-extra/pom.xml +++ b/hutool-extra/pom.xml @@ -246,6 +246,25 @@ compile true + + jakarta.validation + jakarta.validation-api + 2.0.2 + compile + true + + + org.hibernate.validator + hibernate-validator + 6.1.6.Final + test + + + org.glassfish + javax.el + 3.0.0 + test + org.springframework.boot spring-boot-starter-test @@ -258,20 +277,5 @@ 1.2.3 test - - org.hibernate - hibernate-validator - 6.0.12.Final - - - javax.el - javax.el-api - 3.0.1-b01 - - - org.glassfish.web - javax.el - 2.2.6 - diff --git a/hutool-extra/src/main/java/cn/hutool/extra/validation/BeanValidationResult.java b/hutool-extra/src/main/java/cn/hutool/extra/validation/BeanValidationResult.java index 674da5149..2853c6276 100644 --- a/hutool-extra/src/main/java/cn/hutool/extra/validation/BeanValidationResult.java +++ b/hutool-extra/src/main/java/cn/hutool/extra/validation/BeanValidationResult.java @@ -14,29 +14,47 @@ public class BeanValidationResult { /** * 校验是否成功 */ - private Boolean success = Boolean.TRUE; - + private boolean success; /** * 错误消息 */ private List errorMessages = new ArrayList<>(); - public Boolean getSuccess() { + /** + * 构造 + * + * @param success 是否验证成功 + */ + public BeanValidationResult(boolean success){ + this.success = success; + } + + public boolean isSuccess() { return success; } - public void setSuccess(Boolean success) { + public BeanValidationResult setSuccess(boolean success) { this.success = success; + return this; } public List getErrorMessages() { return errorMessages; } - public void setErrorMessages(List errorMessages) { + public BeanValidationResult setErrorMessages(List errorMessages) { this.errorMessages = errorMessages; + return this; } + public BeanValidationResult addErrorMessage(ErrorMessage errorMessage){ + this.errorMessages.add(errorMessage); + return this; + } + + /** + * 错误消息,包括字段名(字段路径)和消息内容 + */ public static class ErrorMessage { /** * 属性字段名称 @@ -62,5 +80,13 @@ public class BeanValidationResult { public void setMessage(String message) { this.message = message; } + + @Override + public String toString() { + return "ErrorMessage{" + + "propertyName='" + propertyName + '\'' + + ", message='" + message + '\'' + + '}'; + } } } diff --git a/hutool-extra/src/main/java/cn/hutool/extra/validation/BeanValidationUtil.java b/hutool-extra/src/main/java/cn/hutool/extra/validation/ValidationUtil.java similarity index 76% rename from hutool-extra/src/main/java/cn/hutool/extra/validation/BeanValidationUtil.java rename to hutool-extra/src/main/java/cn/hutool/extra/validation/ValidationUtil.java index d35abf93b..1118a5f1f 100644 --- a/hutool-extra/src/main/java/cn/hutool/extra/validation/BeanValidationUtil.java +++ b/hutool-extra/src/main/java/cn/hutool/extra/validation/ValidationUtil.java @@ -1,7 +1,6 @@ package cn.hutool.extra.validation; import cn.hutool.extra.validation.BeanValidationResult.ErrorMessage; -import org.hibernate.validator.HibernateValidator; import javax.validation.ConstraintViolation; import javax.validation.Validation; @@ -10,17 +9,25 @@ import java.util.Set; /** - * java bean 校验工具类 + * java bean 校验工具类,此工具类基于validation-api(jakarta.validation-api)封装 + * + *

在实际使用中,用户需引入validation-api的实现,如:hibernate-validator

+ *

注意:hibernate-validator还依赖了javax.el,需自行引入。

* * @author chengqiang */ -public class BeanValidationUtil { +public class ValidationUtil { - private static final Validator validator = Validation.byProvider(HibernateValidator.class).configure().failFast(false).buildValidatorFactory().getValidator(); + private static final Validator validator; + + static { + validator = Validation.buildDefaultValidatorFactory().getValidator(); + } /** * 校验对象 * + * @param Bean类型 * @param bean bean * @param groups 校验组 * @return {@link Set} @@ -29,20 +36,10 @@ public class BeanValidationUtil { return validator.validate(bean, groups); } - /** - * 校验对象 - * - * @param bean bean - * @param groups 校验组 - * @return {@link BeanValidationResult} - */ - public static BeanValidationResult warpValidate(T bean, Class... groups) { - return warpBeanValidationResult(validate(bean, groups)); - } - /** * 校验bean的某一个属性 * + * @param Bean类型 * @param bean bean * @param propertyName 属性名称 * @return {@link Set} @@ -51,6 +48,18 @@ public class BeanValidationUtil { return validator.validateProperty(bean, propertyName, groups); } + /** + * 校验对象 + * + * @param Bean类型 + * @param bean bean + * @param groups 校验组 + * @return {@link BeanValidationResult} + */ + public static BeanValidationResult warpValidate(T bean, Class... groups) { + return warpBeanValidationResult(validate(bean, groups)); + } + /** * 校验bean的某一个属性 * @@ -69,9 +78,8 @@ public class BeanValidationUtil { * @return {@link BeanValidationResult} */ private static BeanValidationResult warpBeanValidationResult(Set> constraintViolations) { - BeanValidationResult result = new BeanValidationResult(); + BeanValidationResult result = new BeanValidationResult(constraintViolations.isEmpty()); for (ConstraintViolation constraintViolation : constraintViolations) { - result.setSuccess(Boolean.FALSE); ErrorMessage errorMessage = new ErrorMessage(); errorMessage.setPropertyName(constraintViolation.getPropertyPath().toString()); errorMessage.setMessage(constraintViolation.getMessage()); diff --git a/hutool-extra/src/main/java/cn/hutool/extra/validation/package-info.java b/hutool-extra/src/main/java/cn/hutool/extra/validation/package-info.java index 286124201..fd0d5f94a 100644 --- a/hutool-extra/src/main/java/cn/hutool/extra/validation/package-info.java +++ b/hutool-extra/src/main/java/cn/hutool/extra/validation/package-info.java @@ -1,5 +1,5 @@ /** - * java bean 校验工具 + * 基于JSR-303标准的校验工具类,封装了javax.validation的API * * @author chengqiang */ diff --git a/hutool-extra/src/test/java/cn/hutool/extra/validation/BeanValidatorUtilTest.java b/hutool-extra/src/test/java/cn/hutool/extra/validation/BeanValidatorUtilTest.java index b8a3cfdd0..395f3ad7d 100644 --- a/hutool-extra/src/test/java/cn/hutool/extra/validation/BeanValidatorUtilTest.java +++ b/hutool-extra/src/test/java/cn/hutool/extra/validation/BeanValidatorUtilTest.java @@ -1,6 +1,6 @@ package cn.hutool.extra.validation; -import cn.hutool.core.lang.Assert; +import org.junit.Assert; import org.junit.Test; import javax.validation.constraints.NotBlank; @@ -39,13 +39,15 @@ public class BeanValidatorUtilTest { @Test public void beanValidatorTest() { - BeanValidationResult result = BeanValidationUtil.warpValidate(new TestClass()); - Assert.isTrue(result.getSuccess()); + BeanValidationResult result = ValidationUtil.warpValidate(new TestClass()); + Assert.assertFalse(result.isSuccess()); + Assert.assertEquals(2, result.getErrorMessages().size()); } @Test public void propertyValidatorTest() { - BeanValidationResult result = BeanValidationUtil.warpValidateProperty(new TestClass(), "name"); - Assert.isTrue(result.getSuccess()); + BeanValidationResult result = ValidationUtil.warpValidateProperty(new TestClass(), "name"); + Assert.assertFalse(result.isSuccess()); + Assert.assertEquals(1, result.getErrorMessages().size()); } }