基于活动验证组的相同字段上的不同验证

时间:2016-12-05 14:56:28

标签: spring hibernate hibernate-validator validationgroup

我正在尝试使用Hibernate Validator验证请求对象。

作为一个简单示例,假设我尝试验证的对象的类具有B bObj字段,其中B是另一个具有String name字段的类。

出于这个原因,我已经实现了我自己的自定义Constraint Annotations链接到自定义MyValidator implements ConstraintValidator类。

DTO课程

@AclassValidate(groups = {Operations.Insert.class, Operations.Update.class javax.validation.groups.Default.class})
public class A {

    @BclassValidate(groups = {Operations.Insert.class, Operations.Update.class})
    private B bObj;

    // setters, getters
}

我的端点方法签名(调用验证程序,并设置活动组):

@PostMapping("/test")
public A createA(
        @Validated(value = Operations.Insert.class) 
        // @Validated(value = Operations.Update.class) 
        @RequestBody A a
)

我的验证员类

public class BclassValidator implements ConstraintValidator<BclassValidate, B> {

    public void initialize(BclassValidate constraintAnnotation) {
    }

    public boolean isValid(B b, ConstraintValidatorContext constraintContext) {

        boolean valid = true;

        // Get active group here
        activeGroup = ..?
        if (activeGroup == Operations.Insert.class) {
            // check if b.getName() equals to "John"
        }
        else if (activeGroup == Operations.Update.class) {
            // check if b.getName() equals to "Doe"
        }

        return valid;
    }
}

我想要实现的是根据活动组对同一字段应用不同的验证。活动组是组,设置为@Validated注释。问题是如何检索活动组以便根据其值应用不同的验证?

3 个答案:

答案 0 :(得分:0)

您无法从约束验证器中获取当前已验证的组。

相反,你应该将你的约束分成几个,在你的情况下,一个用于插入,一个用于更新。然后,您可以将这些单独的约束分配给每个验证组。

答案 1 :(得分:0)

你应该得到这样的活跃验证组:

public class BclassValidator implements ConstraintValidator<BclassValidate, B> {

    public void initialize(BclassValidate constraintAnnotation) {
    }

    public boolean isValid(B b, ConstraintValidatorContext constraintContext) {

        boolean valid = true;

        // Get active group here
        Set<Class<?>> activeGroups = null;
        if (context instanceof ConstraintValidatorContextImpl) {
            activeGroups = ((ConstraintValidatorContextImpl) context).getConstraintDescriptor().getGroups();
        } else {
            activeGroups = Collections.emptySet();
        }

        if (activeGroups.contains(Operations.Insert.class)) {
            // check if b.getName() equals to "John"
        }
        else if (activeGroups.contains(Operations.Update.class)) {
            // check if b.getName() equals to "Doe"
        }

        return valid;
    }
}

答案 2 :(得分:0)

Hibernate 验证器使用自定义约束的配置组验证当前活动的组,因此我们无需编写逻辑来验证它。但是无法找到当前活动的组。

原因:“valueContext”持有当前活动的组,但没有传递给“isValid”方法。

https://github.com/hibernate/hibernate-validator/blob/master/engine/src/main/java/org/hibernate/validator/internal/engine/constraintvalidation/ConstraintTree.java

enter image description here