java Bean验证获取验证组

ha5z0ras  于 2023-03-06  发布在  Java
关注(0)|答案(2)|浏览(123)

是否可以在调用验证方法的验证器中获取组?
我有多个组(Create、Update、Delete),它们大多数会导致对一个bean进行类似的验证。
与其提供多个几乎相同的验证器(并创建实用程序函数来外部化相同的验证代码),我更希望有一个单独的验证器来处理与调用验证的组有关的验证。

  • 在最坏的情况下,我有3倍的n单一验证器和n实用程序类用于共享代码,而不是只有n个验证器。*
Validator.validate(Object, Class<?> ... groups)

我如何让我的验证器中的这些组做一些伪像?

if (groups.contains(Create.class)) // validate create stuff
68bkxrlz

68bkxrlz1#

如果您询问如何在自定义约束(ConstraintValidator实现)中确定当前已验证的约束,答案是无法确定。
组和约束的概念是正交的。约束不应该根据被验证的组而有不同的行为。
在这种情况下,想想约束的用户,如果验证是有条件的,他们怎么知道他们的约束做什么?

bxpogfeg

bxpogfeg2#

正如@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;
    }
}

相关问题