ConstraintValidator也适用于单场和集合

时间:2018-08-23 08:31:56

标签: java spring bean-validation

您能告诉我如何创建适用于单个字段和集合的自定义约束验证器吗?

例如,我有一个对象Foo,其中包含状态枚举

public class Foo {
    Status status;
}

状态可以是activedisabled类型。我想确保在对Foo或Collection类型的某些字段使用注释约束时,约束检查是否将一个或多个字段的状态设置为所需值。

样本:

@StatusCheck(Status.ACTIVE)
public Foo foo;

@StatusCheck(Status.ACTIVE)
public List<Foo> foo;

是否可以使用一个验证器来做到这一点?还是我应该两个?感谢您的建议。

2 个答案:

答案 0 :(得分:2)

是的,您可以为FooList<Foo>使用相同的验证器。

为此,您将需要升级到Hibernate Validator 6.0.x和Bean Validation API 2.0.1。 然后,您可以像这样验证列表元素:

public List<@StatusCheck(Status.ACTIVE) Foo> foos;

另请参阅此answer 对于类似的问题。

您还需要增强@StatusCheck批注的定义 根据目标ElementType.TYPE_PARAMETER, 这样就可以将该注释放在通用类型参数上 在< >之间:

@Target(ElementType.FIELD, ElementType.TYPE_PARAMETER)
....
public @interface StatusCheck {
     ....
}

答案 1 :(得分:2)

我使用注释中定义的多个验证器类解决此问题:

@Documented
@Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = { StatusCheckValidator.class, StatusCheckValidatorList.class })
public @interface StatusCheck {

    String message() default "foo.message";
    Class<?>[] groups() default {};
    Class<? extends Payload>[] payload() default {};
    Status value();
}

如果您知道更好的方法,请随时添加答案:)