您能告诉我如何创建适用于单个字段和集合的自定义约束验证器吗?
例如,我有一个对象Foo,其中包含状态枚举
public class Foo {
Status status;
}
状态可以是active
或disabled
类型。我想确保在对Foo或Collection类型的某些字段使用注释约束时,约束检查是否将一个或多个字段的状态设置为所需值。
样本:
@StatusCheck(Status.ACTIVE)
public Foo foo;
或
@StatusCheck(Status.ACTIVE)
public List<Foo> foo;
是否可以使用一个验证器来做到这一点?还是我应该两个?感谢您的建议。
答案 0 :(得分:2)
是的,您可以为Foo
和List<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();
}
如果您知道更好的方法,请随时添加答案:)