Java验证:多种类型的类型级别注释

时间:2019-11-26 12:01:19

标签: java validation annotations

我想编写一个可用于多种类型的自定义验证批注。我知道可以使用泛型,但是我不能使用泛型,因为我需要在传递给验证器类的类型上调用方法。

所以我想拥有

@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;
    }
}

问题在于???是否有办法将动态内容传递给验证程序。我可以通过实现市场接口来做到这一点,但我正在寻找更内置的框架或实现方式的正确方式。

谢谢

1 个答案:

答案 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;
        }
}