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