我有如下测试:
public class TestSizeAnnotation { public static void main(String[] args) { System.out.println(Validation.buildDefaultValidatorFactory().getValidator().validate(new C())); } public static class P { private List<String> lst = newArrayList("AA"); @Size(max=0, message="P") public List<String> getLst() { return lst; } public void setLst(List<String> lst) { this.lst = lst; } } public static class C extends P { @Override @Size(max=5, message="C") public List<String> getLst() { return super.getLst(); } } }
具有以下输出: [ConstraintViolationImpl{interpolatedMessage='P', propertyPath=lst, rootBeanClass=class com....validator.TestSizeAnnotation$C, messageTemplate='P'}]
[ConstraintViolationImpl{interpolatedMessage='P', propertyPath=lst, rootBeanClass=class com....validator.TestSizeAnnotation$C, messageTemplate='P'}]
但是,我希望注释可以@Size被覆盖,并且不会出现警告。 有没有办法做到这一点?
@Size
编辑:我发现一个错误似乎与此有关,但我最终运行4.2.0,仍然得到上述行为。
实际上,JSR-303不支持覆盖验证注释。相反,子类中重写方法的注释将 累积 应用:从规范的3.3节开始:
约束声明可以放在接口上。对于给定的课程, 持有在超类以及接口上的约束声明是 由Bean验证提供程序评估。规则在 第3.4.5节。 约束声明的作用是累积的。 **约束已声明 将在超类getter上验证所有定义的约束 根据Java语言在getter的覆盖版本上 规范可见性规则。**