Browse Source

Merge pull request #852 from java-acc/feat/785-jdk17-dict-validate-annotation

feat(dict): 实现参数数据字典校验注解 @InDict(#785)
芋道源码 1 year ago
parent
commit
9c71bc3220

+ 6 - 0
yudao-framework/yudao-spring-boot-starter-excel/pom.xml

@@ -46,6 +46,12 @@
             <artifactId>easyexcel</artifactId>
         </dependency>
 
+        <dependency>
+            <groupId>jakarta.validation</groupId>
+            <artifactId>jakarta.validation-api</artifactId>
+            <scope>provided</scope>
+        </dependency>
+
         <dependency>
             <groupId>com.google.guava</groupId>
             <artifactId>guava</artifactId>

+ 5 - 0
yudao-framework/yudao-spring-boot-starter-excel/src/main/java/cn/iocoder/yudao/framework/dict/core/DictFrameworkUtils.java

@@ -76,4 +76,9 @@ public class DictFrameworkUtils {
         return dictData!= null ? dictData.getValue(): null;
     }
 
+    @SneakyThrows
+    public static List<String> getDictDataValueList(String dictType) {
+        List<DictDataRespDTO> dictDatas = GET_DICT_DATA_CACHE.get(dictType);
+        return convertList(dictDatas, DictDataRespDTO::getValue);
+    }
 }

+ 38 - 0
yudao-framework/yudao-spring-boot-starter-excel/src/main/java/cn/iocoder/yudao/framework/dict/validation/InDict.java

@@ -0,0 +1,38 @@
+package cn.iocoder.yudao.framework.dict.validation;
+
+import jakarta.validation.Constraint;
+import jakarta.validation.Payload;
+
+import java.lang.annotation.Documented;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+@Target({
+        ElementType.METHOD,
+        ElementType.FIELD,
+        ElementType.ANNOTATION_TYPE,
+        ElementType.CONSTRUCTOR,
+        ElementType.PARAMETER,
+        ElementType.TYPE_USE
+})
+@Retention(RetentionPolicy.RUNTIME)
+@Documented
+@Constraint(
+        validatedBy = {InDictValidator.class, InDictCollectionValidator.class}
+)
+public @interface InDict {
+
+    /**
+     * 数据字典type
+     */
+    String type();
+
+    String message() default "必须在指定范围 {value}";
+
+    Class<?>[] groups() default {};
+
+    Class<? extends Payload>[] payload() default {};
+
+}

+ 40 - 0
yudao-framework/yudao-spring-boot-starter-excel/src/main/java/cn/iocoder/yudao/framework/dict/validation/InDictCollectionValidator.java

@@ -0,0 +1,40 @@
+package cn.iocoder.yudao.framework.dict.validation;
+
+import cn.iocoder.yudao.framework.common.util.string.StrUtils;
+import cn.iocoder.yudao.framework.dict.core.DictFrameworkUtils;
+import jakarta.validation.ConstraintValidator;
+import jakarta.validation.ConstraintValidatorContext;
+
+import java.util.Collection;
+import java.util.List;
+
+public class InDictCollectionValidator implements ConstraintValidator<InDict, Collection<?>> {
+
+    private String dictType;
+
+    @Override
+    public void initialize(InDict annotation) {
+        this.dictType = annotation.type();
+    }
+
+    @Override
+    public boolean isValid(Collection<?> list, ConstraintValidatorContext context) {
+        if (list == null) {
+            return true;
+        }
+        List<String> dbValues = DictFrameworkUtils.getDictDataValueList(dictType);
+        boolean match = list.stream().allMatch(v -> dbValues.stream()
+                .anyMatch(dbValue -> dbValue.equalsIgnoreCase(v.toString())));
+        if (match) {
+            return true;
+        }
+        // 校验不通过,自定义提示语句
+        context.disableDefaultConstraintViolation(); // 禁用默认的 message 的值
+        context.buildConstraintViolationWithTemplate(
+                context.getDefaultConstraintMessageTemplate().replaceAll("\\{value}",dbValues.toString())
+        ).addConstraintViolation(); // 重新添加错误提示语句
+        return false;
+    }
+
+}
+

+ 40 - 0
yudao-framework/yudao-spring-boot-starter-excel/src/main/java/cn/iocoder/yudao/framework/dict/validation/InDictValidator.java

@@ -0,0 +1,40 @@
+package cn.iocoder.yudao.framework.dict.validation;
+
+import cn.iocoder.yudao.framework.common.util.string.StrUtils;
+import cn.iocoder.yudao.framework.dict.core.DictFrameworkUtils;
+import jakarta.validation.ConstraintValidator;
+import jakarta.validation.ConstraintValidatorContext;
+
+import java.util.List;
+
+public class InDictValidator implements ConstraintValidator<InDict, Object> {
+
+    private String dictType;
+
+    @Override
+    public void initialize(InDict annotation) {
+        this.dictType = annotation.type();
+    }
+
+    @Override
+    public boolean isValid(Object value, ConstraintValidatorContext context) {
+        // 为空时,默认不校验,即认为通过
+        if (value == null) {
+            return true;
+        }
+        // 校验通过
+        final List<String> values = DictFrameworkUtils.getDictDataValueList(dictType);
+        boolean match = values.stream().anyMatch(v -> v.equalsIgnoreCase(value.toString()));
+        if (match) {
+            return true;
+        }
+        // 校验不通过,自定义提示语句
+        context.disableDefaultConstraintViolation(); // 禁用默认的 message 的值
+        context.buildConstraintViolationWithTemplate(
+                context.getDefaultConstraintMessageTemplate().replaceAll("\\{value}", values.toString())
+        ).addConstraintViolation(); // 重新添加错误提示语句
+        return false;
+    }
+
+}
+