bean 验证获取验证组

问题描述 投票:0回答:2

是否有可能在调用验证方法的验证器中获取组?

我有多个组(创建、更新、删除),大多数会导致对一个 bean 进行类似的验证。
与其提供多个几乎相同的验证器(并创建实用程序函数来外部化相同的验证代码),我更希望有一个验证器来处理有关调用验证的组的验证。

在最坏的情况下,我有 3 次

n
单个验证器和
n
用于共享代码的实用程序类,而不仅仅是 n 个验证器。

Validator.validate(Object, Class<?> ... groups)

我如何让我的验证器中的那些组做一些类似伪的事情?

if (groups.contains(Create.class)) // validate create stuff
java bean-validation
2个回答
1
投票

如果您询问如何在自定义约束(ConstraintValidator 实现)中确定当前验证的约束,答案是您不能。

组和约束的概念是正交的。约束的行为不应因验证的组而异。

在这种情况下,考虑约束的用户。如果验证是有条件的,他们怎么知道他们的约束是做什么的?


0
投票

正如@hardy 在他的回答中所述,在验证器实现中无法在运行时检索验证组。但可以使用创建不同注释并指定组或使用重复注释的变通方法来完成。

例子:

@ValidFoo
@ValidFoo(bar = true, groups =
{
    FooBarGroup.class
})
public class Foo 
{
    private Bar bar;
}

注释

@Repeatable(ValidFoo.List.class)
public @interface ValidFoo
{
    public String message() default "{package.ValidFoo.message}";

    Class<?>[] groups() default {};

    Class<? extends Payload>[] payload() default {};
    
    /*
     * toggle bar validation
     */
    public boolean bar() default false;

    public @interface List
    {
        ValidOrderCost[] value();
    }
}

实施

public class FooValidator implements ConstraintValidator<ValidFoo, Foo>
{
    private boolean bar;

    @Override
    public void initialize(final ValidFooconstraintAnnotation)
    {
        this.bar = constraintAnnotation.bar();
    }

    
    @Override
    public boolean isValid(final Foo foo, final ConstraintValidatorContext context)
    {
        // 1. default validations
        
        // 2. toggle bar specific validation
        if (this.bar)
        {
            // validate bar
        }

        return true;
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.