diff --git a/pom.xml b/pom.xml index f04a10f..9c9988e 100644 --- a/pom.xml +++ b/pom.xml @@ -12,19 +12,14 @@ 21 21 UTF-8 - 5.2.1.RELEASE 5.8.26 0.9.10 2.0.1.Final + 3.2.1 - - org.springframework - spring-context - ${springContext.version} - cn.hutool hutool-all @@ -40,6 +35,10 @@ validation-api ${validation.version} - + + org.apache.commons + commons-jexl3 + ${jexl.version} + \ No newline at end of file diff --git a/src/main/java/com/hua/test/valid/Student.java b/src/main/java/com/hua/test/valid/Student.java index 62e5a1d..90bd4bd 100644 --- a/src/main/java/com/hua/test/valid/Student.java +++ b/src/main/java/com/hua/test/valid/Student.java @@ -8,7 +8,7 @@ import com.hua.valid.annotation.ConditionNotNull; */ public class Student { - @ConditionNotNull(test = "teaName == '王老师' and teaAge == 28 and teaSex == 1", message = "老师名字为王老师,年龄为18,性别为1的时候 name不能为null") + @ConditionNotNull(expression = "teaName == '王老师' and teaAge == 28 and teaSex == 1", message = "老师名字为王老师,年龄为18,性别为1的时候 name不能为null") private String name; private int age; diff --git a/src/main/java/com/hua/valid/ConditionNotNullHandler.java b/src/main/java/com/hua/valid/ConditionNotNullHandler.java index 4f8e2f9..5c96db4 100644 --- a/src/main/java/com/hua/valid/ConditionNotNullHandler.java +++ b/src/main/java/com/hua/valid/ConditionNotNullHandler.java @@ -1,10 +1,13 @@ package com.hua.valid; +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.lang.Dict; import cn.hutool.core.util.StrUtil; +import cn.hutool.extra.expression.ExpressionUtil; import com.hua.annotation.Handles; import com.hua.valid.annotation.ConditionNotNull; -import org.springframework.expression.ExpressionParser; -import org.springframework.expression.spel.standard.SpelExpressionParser; + +import java.util.Map; /** * @author Hua @@ -15,13 +18,26 @@ public class ConditionNotNullHandler implements AnnotationHandler { @Override public boolean handle(HandleDTO handleDTO) { ConditionNotNull conditionValidate = (ConditionNotNull) handleDTO.getCurrentAnnotation(); - String test = conditionValidate.test(); - if (StrUtil.isEmpty(test)) { + String expression = conditionValidate.expression(); + if (StrUtil.isEmpty(expression)) { return true; } - ExpressionParser parser = new SpelExpressionParser(); + if (handleDTO.getField() == null) { + return true; + } + Dict context = new Dict(); - Boolean value = parser.parseExpression(test).getValue(handleDTO.getOriginObj(), Boolean.class); + Map fieldMap = BeanUtil.beanToMap(handleDTO.getOriginObj(), false, true); + context.putAll(fieldMap); + + try { + Object fieldValue = BeanUtil.getFieldValue(handleDTO.getOriginObj(), handleDTO.getField().getName()); + context.set(handleDTO.getField().getName(), fieldValue); + } catch (Exception e) { + throw new RuntimeException("Unable to access field value", e); + } + + Boolean value = (Boolean) ExpressionUtil.eval(expression, context); if (Boolean.TRUE.equals(value) && handleDTO.getFieldValue() == null) { handleDTO.getErrorMessage().addErrorObj(conditionValidate.message(), handleDTO.getField()); return false; diff --git a/src/main/java/com/hua/valid/annotation/ConditionNotNull.java b/src/main/java/com/hua/valid/annotation/ConditionNotNull.java index 7be7d09..23201d5 100644 --- a/src/main/java/com/hua/valid/annotation/ConditionNotNull.java +++ b/src/main/java/com/hua/valid/annotation/ConditionNotNull.java @@ -10,7 +10,7 @@ import java.lang.annotation.*; @Target({ElementType.PARAMETER, ElementType.FIELD}) @Retention(RetentionPolicy.RUNTIME) public @interface ConditionNotNull { - String test() default ""; + String expression() default ""; String message() default ""; } diff --git a/src/main/java/com/hua/valid/annotation/PackageScanConfig.java b/src/main/java/com/hua/valid/annotation/PackageScanConfig.java index a5499a2..2716620 100644 --- a/src/main/java/com/hua/valid/annotation/PackageScanConfig.java +++ b/src/main/java/com/hua/valid/annotation/PackageScanConfig.java @@ -8,7 +8,7 @@ import java.lang.annotation.Target; @Target(ElementType.TYPE) // 类或接口上使用 @Retention(RetentionPolicy.RUNTIME) // 在运行时可见 public @interface PackageScanConfig { - boolean useSPI() default false; // 默认为空数组 - boolean useReflection() default false; // 默认为空数组 + boolean useSPI() default false; // 默认为false + boolean useReflection() default false; // 默认为false String[] packages() default {}; // 默认为空数组 }