Kai*_*ugo 7 java validation annotations hibernate hibernate-mapping
在了解了Hibernate Custom Validators之后,它让我对一个主题感兴趣,我是否可以创建一个基本注释,其中我可以设置使用哪个Validator?
@Target({ ElementType.FIELD })
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = validator().class)
public @interface CustomAnnotation {
public String message();
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
Class<? extends ConstraintValidator<? extends CustomAnnotation, Serializable>> validator();
}
Run Code Online (Sandbox Code Playgroud)
所以,我可以用@CustomAnnotation这种方式
@CustomAnnotation(validator = CustomConstraintValidator.class, message = "validationMessage")
private Object fieldName;
Run Code Online (Sandbox Code Playgroud)
我不推荐它,但你可以大致这样做:
@Target({ ElementType.FIELD })
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = GenericValidatorBootstrapperValidator.class)
public @interface CustomAnnotation {
public String message();
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
Class<? extends ConstraintValidator<? extends CustomAnnotation, Serializable>> validator();
}
public class GenericValidatorBootstrapperValidator implements ConstraintValidator<CustomAnnotation, Object> {
private final ConstraintValidator validator;
@Override
public void initialize(CustomAnnotation constraintAnnotation) {
Class<? extends ConstraintValidator> validatorClass = constraintAnnotation.validator();
validator = validatorClass.newInstance();
validator.initialize( ... ); //TODO with what?
}
@Override
public boolean isValid(Object value, ConstraintValidatorContext context) {
return validator.isValid(value, context);
}
}
Run Code Online (Sandbox Code Playgroud)
但同样,更喜欢特定的注释,它们更具表现力.
在你的评论之后,我认为你想要的是能够根据属性的返回类型设置不同的验证器
@CustomAnnotation
List<String> foo;
@CustomAnnotation
Table bar;
Run Code Online (Sandbox Code Playgroud)
如果是这种情况,请在@Constraint注释中添加几个验证器实现.
@Target({ ElementType.FIELD })
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = {ListValidatorImpl.class, TableValidatorImpl.class, ...})
public @interface CustomAnnotation {
public String message();
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
public class ListValidatorImpl implements ConstraintValidator<CustomAnnotation, List> {
@Override
public boolean isValid(List value, ConstraintValidatorContext context) {
}
}
public class TableValidatorImpl implements ConstraintValidator<CustomAnnotation, Table> {
@Override
public boolean isValid(Table value, ConstraintValidatorContext context) {
}
}
Run Code Online (Sandbox Code Playgroud)
您甚至可以通过META/validation.xml文件将约束注释与实现链接起来
<constraint-mappings
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://jboss.org/xml/ns/javax/validation/mapping validation-mapping-1.1.xsd"
xmlns="http://jboss.org/xml/ns/javax/validation/mapping" version="1.1">
<constraint-definition annotation="org.mycompany.CustomAnnotation">
<validated-by include-existing-validators="true">
<value>org.mycompany.EnumCustomValidatorImpl</value>
</validated-by>
</constraint-definition>
</constraint-mappings>
Run Code Online (Sandbox Code Playgroud)
如果你需要更灵活的东西,我认为我的初步建议是有效的.在GenericValidatorBootstrapperValidatorisValid方法中,您可以根据value参数的对象类型调用正确的验证器实例(instanceof例如,通过).
我认为您无法在 Hibernate Validator 支持之上实现动态验证器解析器。最好拥有一组专用的注释-验证器对,这样当您使用特定的验证注释对字段进行注释时,就很清楚将使用什么验证器。
| 归档时间: |
|
| 查看次数: |
3463 次 |
| 最近记录: |