有没有可能创建一个约束注释,它针对一个接口,但可以用于验证实现了该接口的任何具体实现?
例如,我们有一个名为Identifiable
的接口:
public interface Identifiable {
String getId();
}
我想创建一个针对 List<Identifiable>
的约束:
@Documented
@Constraint(validatedBy = IdentifiablesValidator.class)
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD})
public @interface Identifiables {
// ...Constraint properties...
}
public class IdentifiablesValidator implements ConstraintValidator<Identifiables, List<Identifiable>> {
// ...Validator logic...
}
然后将约束条件应用于实现该接口的目标:
public class SomeExampleCase {
@Identifiables()
List<IdentifiableImpl> sut;
}
在运行时,这会导致一个错误:
javax.validation.UnexpectedTypeException: HV000030: No validator could be found for constraint 'com.example.Identifiables' validating type 'java.util.List<com.example.IdentifiableImpl>'. Check configuration for 'identifiables'
使用该约束,可以对接口列表(例如List<Identifiable>
)进行验证。但是这将强制目标类(例如SomeExampleCase
)使用接口而不是实现,这会妨碍各种类型的操作(例如Marshalling / Unmarshalling)。
是否有一种方法可以让验证器与实际的List<Identifiable>
一起工作,而无需重写它以针对“List”?
提前致谢!
更新1:当将接口转换为抽象类时,将出现相同的问题。