小葡萄、 2024-06-12 14:03 采纳率: 11.1%
浏览 22
已结题

@Valid 中的动态判断

最近用到@Valid @NotEmpty 这些表达式 可以不为空 但是有个问题 就是加入我某个字段type=1的话 有些字段可以为空 type=2是 不能为空 我如果加了NotEmpty 那么 就都不能为空了 有什么 方法可以动态的。直接加个什么单词 就好使了 不用写的很麻烦

  • 写回答

7条回答 默认 最新

  • 专家-赤兔[在线] 优质创作者: 编程框架技术领域 2024-06-12 14:03
    关注

    引自免费微信小程序:皆我百晓生

    在Java中,使用JSR 303/JSR 349(即Hibernate Validator)进行数据校验时,确实可以通过更加灵活的方式来处理不同条件下的字段有效性检查。针对你所描述的问题,即根据某个字段(比如type)的值来动态决定其他字段是否必须非空,可以利用自定义注解和条件逻辑来实现。

    步骤1:创建自定义注解

    首先,你需要定义一个自定义注解,这个注解将携带你所需要的条件信息。例如:

    import javax.validation.Constraint;
    import javax.validation.Payload;
    import java.lang.annotation.ElementType;
    import java.lang.annotation.Retention;
    import java.lang.annotation.RetentionPolicy;
    import java.lang.annotation.Target;
    
    @Target({ElementType.FIELD, ElementType.PARAMETER})
    @Retention(RetentionPolicy.RUNTIME)
    @Constraint(validatedBy = TypeDependentNotEmptyValidator.class)
    public @interface TypeDependentNotEmpty {
        String message() default "Field must not be empty based on the type";
        Class<?>[] groups() default {};
        Class<? extends Payload>[] payload() default {};
        int type();
    }
    

    这里的关键在于@Constraint(validatedBy = TypeDependentNotEmptyValidator.class),它指定了一个验证器类TypeDependentNotEmptyValidator,用于执行具体的逻辑判断。

    步骤2:创建验证器

    接下来,实现上述注解的验证逻辑。这通常涉及创建一个实现了ConstraintValidator接口的类:

    import javax.validation.ConstraintValidator;
    import javax.validation.ConstraintValidatorContext;
    import javax.validation.constraintvalidation.SupportedValidationTarget;
    import javax.validation.constraintvalidation.ValidationTarget;
    
    @SupportedValidationTarget(ValidationTarget.ANNOTATED_ELEMENT)
    public class TypeDependentNotEmptyValidator implements ConstraintValidator<TypeDependentNotEmpty, String> {
        private int requiredType;
    
        @Override
        public void initialize(TypeDependentNotEmpty constraintAnnotation) {
            this.requiredType = constraintAnnotation.type();
        }
    
        @Override
        public boolean isValid(String value, ConstraintValidatorContext context) {
            // 假设这里的 'type' 是从某个地方获取的当前类型值
            int currentType = getCurrentType(); // 需要你实现这个方法来获取实际的type值
    
            if (currentType == requiredType) {
                return value != null && !value.trim().isEmpty();
            }
            return true; // 如果类型不符合,不进行验证
        }
    }
    

    步骤3:使用自定义注解

    最后,在你的实体类中使用这个自定义注解:

    public class MyEntity {
        @TypeDependentNotEmpty(type = 2)
        private String fieldThatMustBeNonEmptyIfTypeIs2;
    
        // getter and setter methods...
    }
    

    通过这种方式,你可以根据type字段的值动态地控制fieldThatMustBeNonEmptyIfTypeIs2字段是否必须非空。

    注意事项

    • 确保getCurrentType()方法能够正确返回type字段的值,可能需要从请求参数、数据库查询或其他上下文信息中获取。
    • 调整TypeDependentNotEmptyTypeDependentNotEmptyValidator以适应你的具体需求,比如支持更多的条件或更复杂的逻辑。

    通过以上步骤,你可以实现基于特定条件的动态字段验证,而无需在业务逻辑中编写额外的条件检查代码。

    评论 编辑记录

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 6月12日
  • 创建了问题 6月12日