有没有一种可以针对接口而不是类型的约束注解?

4

有没有可能创建一个约束注释,它针对一个接口,但可以用于验证实现了该接口的任何具体实现?

例如,我们有一个名为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:当将接口转换为抽象类时,将出现相同的问题。

1个回答

2

我也有同样的问题,经过一些尝试,我终于让它对我起作用了:

@Documented
@Constraint(validatedBy = IdentifiablesValidator.class)
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD})
public @interface Identifiables {
    // ...Constraint properties...
}

public class IdentifiablesValidator implements ConstraintValidator<Identifiables, List<? extends Identifiable>> {
    // ...Validator logic...
}

重要的部分是更改 <? extends Interface>


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接