一尘不染

我可以覆盖jsr-303验证注释吗

hibernate

我有如下测试:

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'}]

但是,我希望注释可以@Size被覆盖,并且不会出现警告。
有没有办法做到这一点?

编辑:我发现一个错误似乎与此有关,但我最终运行4.2.0,仍然得到上述行为。


阅读 246

收藏
2020-06-20

共1个答案

一尘不染

实际上,JSR-303不支持覆盖验证注释。相反,子类中重写方法的注释将 累积 应用:从规范的3.3节开始:

约束声明可以放在接口上。对于给定的课程,
持有在超类以及接口上的约束声明是
由Bean验证提供程序评估。规则在
第3.4.5节。

约束声明的作用是累积的。 **约束已声明
将在超类getter上验证所有定义的约束
根据Java语言在getter的覆盖版本上
规范可见性规则。**
2020-06-20