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

Java validation: type level annotation for multiple types

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

所以我想要

@MyAnnotation
public class RequestA{
 private MyObject myObject;
 private String value;
}

和另一个具有相同注释的 class

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

问题是 ???,有没有办法将一些动态的东西传递给验证器。我可以通过实施市场界面来做到这一点,但我正在寻找更多内置框架或 proper 的方法。

谢谢

你不能定义泛型 class 所以你需要使用 Object 而不是那个 因此,我假设您使用 ParentClass 检查 classes。像这样:

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