你能告诉我如何创建自定义约束验证器,它也适用于单个字段和集合吗?
例如,我有一个对象Foo,其中包含状态的枚举
public class Foo {
Status status;
}
状态可以是active
或disabled
的类型。我想确保当我对 Foo 或 Collection 类型的某些字段使用注释约束时,约束检查字段/字段是否已将状态设置为所需值。
样品:
@StatusCheck(Status.ACTIVE)
public Foo foo;
或
@StatusCheck(Status.ACTIVE)
public List<Foo> foo;
可以用一个验证器做到这一点吗?还是我应该做两个?谢谢建议。
我使用注释中定义的多个验证器类来解决它,如下所示:
@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();
}
如果您知道如何做到这一点,请随时添加您的答案:)
是的,您可以对Foo
和List<Foo>
使用相同的验证器。
为此,您需要升级到Hibernate验证器6.0.x和Bean Validation API 2.0.1。 然后,您可以像这样验证列表元素:
public List<@StatusCheck(Status.ACTIVE) Foo> foos;
另请参阅此答案 对于类似的问题。
您还需要增强@StatusCheck
注释的定义 通过目标ElementType.TYPE_PARAMETER
, 以便允许将该注释放在泛型类型参数上< >
之间:
@Target(ElementType.FIELD, ElementType.TYPE_PARAMETER)
....
public @interface StatusCheck {
....
}