2

我正在尝试使用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注释处设置的组。问题是如何检索活动组以根据其值应用不同的验证?

4

3 回答 3

1

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

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

于 2017-02-03T22:19:40.337 回答
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;
    }
}
于 2018-04-13T08:51:01.050 回答
0

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

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

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

在此处输入图像描述

于 2021-02-10T17:21:15.277 回答