diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/validate/enums/EnumPatternValidator.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/validate/enums/EnumPatternValidator.java index 14f15a245..6f0754ca2 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/validate/enums/EnumPatternValidator.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/validate/enums/EnumPatternValidator.java @@ -1,5 +1,7 @@ package org.dromara.common.core.validate.enums; +import cn.hutool.core.convert.Convert; +import cn.hutool.core.util.BooleanUtil; import jakarta.validation.ConstraintValidator; import jakarta.validation.ConstraintValidatorContext; import org.dromara.common.core.utils.StringUtils; @@ -14,12 +16,17 @@ import java.util.Set; * @author 秋辞未寒 * @date 2024-12-09 */ -public class EnumPatternValidator implements ConstraintValidator { +public class EnumPatternValidator implements ConstraintValidator { /** * 枚举允许值集合。 */ - private final Set values = new HashSet<>(); + private final Set values = new HashSet<>(); + + /** + * 枚举字段值类型。 + */ + private Class valueType; /** * 初始化枚举允许值集合。 @@ -36,24 +43,43 @@ public class EnumPatternValidator implements ConstraintValidator以枚举字段的实际类型转换输入值后进行比较,可兼容字符串、数字、布尔值等字段类型, + * 同时避免将无法转换的值视为合法值。字符串类型的空白值按未填写处理,其他类型仅 null + * 按未填写处理。

* * @param value 待校验值 * @param constraintValidatorContext 校验上下文 * @return true 校验通过 false 校验失败 */ @Override - public boolean isValid(String value, ConstraintValidatorContext constraintValidatorContext) { - if (StringUtils.isBlank(value)) { + public boolean isValid(Object value, ConstraintValidatorContext constraintValidatorContext) { + if (value == null) { return true; } - return values.contains(value); + if (valueType == null) { + return false; + } + if (value instanceof CharSequence && StringUtils.isBlank(value.toString()) + && CharSequence.class.isAssignableFrom(valueType)) { + return true; + } + if ((valueType == Boolean.class || valueType == boolean.class) && value instanceof CharSequence + && BooleanUtil.toBooleanObject(value.toString()) == null) { + return false; + } + Object convertedValue = Convert.convertWithCheck(valueType, value, null, true); + return convertedValue != null && values.contains(convertedValue); } }