From 3dad27df3f747d60f47c1504286c86f6636e7242 Mon Sep 17 00:00:00 2001 From: Charles7c Date: Sun, 6 Jul 2025 19:23:48 +0800 Subject: [PATCH] =?UTF-8?q?feat(validation):=20=E5=A2=9E=E5=BC=BA=20EnumVa?= =?UTF-8?q?lue=20=E6=9E=9A=E4=B8=BE=E6=A0=A1=E9=AA=8C=E5=99=A8=EF=BC=8C?= =?UTF-8?q?=E6=94=AF=E6=8C=81=E6=9E=9A=E4=B8=BE=E5=80=BC=E7=9A=84=E6=95=B0?= =?UTF-8?q?=E7=BB=84=E5=92=8C=E9=9B=86=E5=90=88=E6=A0=A1=E9=AA=8C=EF=BC=8C?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=AF=B9=20BaseEnum=20=E6=8E=A5=E5=8F=A3?= =?UTF-8?q?=E7=9A=84=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ....java => ValidationAutoConfiguration.java} | 21 ++++---- .../constraints/EnumValueValidator.java | 51 ++++++++++++++++--- ...ot.autoconfigure.AutoConfiguration.imports | 2 +- 3 files changed, 55 insertions(+), 19 deletions(-) rename continew-starter-validation/src/main/java/top/continew/starter/validation/autoconfigure/{ValidatorAutoConfiguration.java => ValidationAutoConfiguration.java} (77%) diff --git a/continew-starter-validation/src/main/java/top/continew/starter/validation/autoconfigure/ValidatorAutoConfiguration.java b/continew-starter-validation/src/main/java/top/continew/starter/validation/autoconfigure/ValidationAutoConfiguration.java similarity index 77% rename from continew-starter-validation/src/main/java/top/continew/starter/validation/autoconfigure/ValidatorAutoConfiguration.java rename to continew-starter-validation/src/main/java/top/continew/starter/validation/autoconfigure/ValidationAutoConfiguration.java index 8d874ce1..2ec4462a 100644 --- a/continew-starter-validation/src/main/java/top/continew/starter/validation/autoconfigure/ValidatorAutoConfiguration.java +++ b/continew-starter-validation/src/main/java/top/continew/starter/validation/autoconfigure/ValidationAutoConfiguration.java @@ -18,26 +18,24 @@ package top.continew.starter.validation.autoconfigure; import jakarta.annotation.PostConstruct; import jakarta.validation.Validator; -import org.hibernate.validator.HibernateValidator; +import org.hibernate.validator.BaseHibernateValidatorConfiguration; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.boot.autoconfigure.AutoConfiguration; +import org.springframework.boot.autoconfigure.AutoConfigureBefore; import org.springframework.context.MessageSource; import org.springframework.context.annotation.Bean; import org.springframework.validation.beanvalidation.LocalValidatorFactoryBean; -import java.util.Properties; - /** * JSR 303 校验器自动配置 * * @author Charles7c * @since 2.3.0 */ -@AutoConfiguration -public class ValidatorAutoConfiguration { +@AutoConfigureBefore +public class ValidationAutoConfiguration { - private static final Logger log = LoggerFactory.getLogger(ValidatorAutoConfiguration.class); + private static final Logger log = LoggerFactory.getLogger(ValidationAutoConfiguration.class); /** * Validator 失败立即返回模式配置 @@ -51,10 +49,9 @@ public class ValidatorAutoConfiguration { try (LocalValidatorFactoryBean factoryBean = new LocalValidatorFactoryBean()) { // 国际化 factoryBean.setValidationMessageSource(messageSource); - factoryBean.setProviderClass(HibernateValidator.class); - Properties properties = new Properties(); - properties.setProperty("hibernate.validator.fail_fast", "true"); - factoryBean.setValidationProperties(properties); + // 快速失败 + factoryBean.getValidationPropertyMap() + .put(BaseHibernateValidatorConfiguration.FAIL_FAST, Boolean.TRUE.toString()); factoryBean.afterPropertiesSet(); return factoryBean.getValidator(); } @@ -62,6 +59,6 @@ public class ValidatorAutoConfiguration { @PostConstruct public void postConstruct() { - log.debug("[ContiNew Starter] - Auto Configuration 'Validator' completed initialization."); + log.debug("[ContiNew Starter] - Auto Configuration 'Validation' completed initialization."); } } diff --git a/continew-starter-validation/src/main/java/top/continew/starter/validation/constraints/EnumValueValidator.java b/continew-starter-validation/src/main/java/top/continew/starter/validation/constraints/EnumValueValidator.java index dc14efe6..3a123d42 100644 --- a/continew-starter-validation/src/main/java/top/continew/starter/validation/constraints/EnumValueValidator.java +++ b/continew-starter-validation/src/main/java/top/continew/starter/validation/constraints/EnumValueValidator.java @@ -22,10 +22,10 @@ import jakarta.validation.ConstraintValidator; import jakarta.validation.ConstraintValidatorContext; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import top.continew.starter.core.enums.BaseEnum; import java.lang.reflect.Method; import java.util.Arrays; -import java.util.function.Function; /** * 枚举校验器 @@ -53,17 +53,53 @@ public class EnumValueValidator implements ConstraintValidator iterable) { + for (Object element : iterable) { + if (!isValidElement(element)) { + return false; + } + } + return true; + } + + // 处理单个值场景 + return isValidElement(value); + } + + /** + * 校验单个元素是否有效 + * + * @param value 待校验的值 + * @return 是否有效 + */ + private boolean isValidElement(Object value) { // 优先校验 enumValues if (enumValues.length > 0) { return Arrays.asList(enumValues).contains(Convert.toStr(value)); } + Enum[] enumConstants = enumClass.getEnumConstants(); if (enumConstants.length == 0) { return false; } + if (CharSequenceUtil.isBlank(enumMethod)) { - return findEnumValue(enumConstants, Enum::toString, Convert.toStr(value)); + return findEnumValue(enumConstants, Convert.toStr(value)); } + try { // 枚举类指定了方法名,则调用指定方法获取枚举值 Method method = enumClass.getMethod(enumMethod); @@ -82,16 +118,19 @@ public class EnumValueValidator implements ConstraintValidator function, Object value) { + private boolean findEnumValue(Enum[] enumConstants, Object value) { for (Enum enumConstant : enumConstants) { - if (function.apply(enumConstant).equals(value)) { + if (enumConstant instanceof BaseEnum baseEnum) { + if (baseEnum.getValue().toString().equals(value)) { + return true; + } + } else if (enumConstant.toString().equals(value)) { return true; } } return false; } -} +} \ No newline at end of file diff --git a/continew-starter-validation/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/continew-starter-validation/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports index c1c6c3d9..27513022 100644 --- a/continew-starter-validation/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports +++ b/continew-starter-validation/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports @@ -1 +1 @@ -top.continew.starter.validation.autoconfigure.ValidatorAutoConfiguration \ No newline at end of file +top.continew.starter.validation.autoconfigure.ValidationAutoConfiguration \ No newline at end of file