我想编写一个可用于多种类型的自定义验证批注。我知道可以使用泛型,但是我不能使用泛型,因为我需要在传递给验证器类的类型上调用方法。
所以我想拥有
@MyAnnotation
public class RequestA{
private MyObject myObject;
private String value;
}
和另一个具有相同注释的类
@MyAnnotation
public class RequestB{
private MyObject myObject;
private String value;
}
@Documented
@Constraint(validatedBy = MyAnnotationValidator.class)
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface ValidHoursRequested {
String message() default "The value is null or missing";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
并且验证器必须看起来像这样
public class RequestedHoursValidator implements ConstraintValidator<MyAnnotation, ???> {
public void initialize(MyAnnotation constraint) {
}
@Override
public boolean isValid(??? request, ConstraintValidatorContext context) {
if (request.getMyObject().checkWahtever()) {
return request.getValue() != null;
}
return true;
}
}
问题在于???
是否有办法将动态内容传递给验证程序。我可以通过实现市场接口来做到这一点,但我正在寻找更内置的框架或实现方式的正确方式。
谢谢
答案 0 :(得分:0)
您无法定义泛型类,因此需要使用Object代替
因此,我假设您使用ParentClass
检查课程。像这样:
public class ParentClass {
abstract boolean checkWahtever();
abstract Object getValue();
}
public class RequestedHoursValidator implements ConstraintValidator<MyAnnotation, Object > {
public void initialize(MyAnnotation constraint) {
}
@Override
public boolean isValid(Object request, ConstraintValidatorContext context) {
if (request instanceof ParentClass) {
ParentClass parent =request;
if (parent.checkWahtever()) {
return parent.getValue() != null;
}
return true;
}
}