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

Java 我可以覆盖jsr-303验证注释吗,java,hibernate,annotations,bean-validation,Java,Hibernate,Annotations,Bean Validation,我有一个如下的测试: public class TestSizeAnnotation { public static void main(String[] args) { System.out.println(Validation.buildDefaultValidatorFactory().getValidator().validate(new C())); } public static class P { priva

我有一个如下的测试:

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();
        }
    }
}
public类testsizeanotation
{
公共静态void main(字符串[]args)
{
System.out.println(Validation.buildDefaultValidatorFactory().getValidator().validate(新的C());
}
公共静态类P
{
私有列表lst=newArrayList(“AA”);
@大小(最大值=0,message=“P”)
公共列表getLst()
{
返回lst;
}
公共无效集合lst(列表lst)
{
这是1.lst=lst;
}
}
公共静态类C扩展了P
{
@凌驾
@大小(最大值=5,message=“C”)
公共列表getLst()
{
返回super.getLst();
}
}
}
具有以下输出:
[ConstraintViolationImpl{interpolatedMessage='P',propertyPath=lst,rootBeanClass=class com….validator.TestSizeAnotation$C,messageTemplate='P'}]

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


编辑:我发现似乎与此相关,但我运行了4.2.0 final,仍然获得了上述行为。

您可以通过xml配置验证注释配置验证:


在您的情况下,如果在validation.xml文件中为getList()methid声明不同的验证(或无验证),它将覆盖
@Size
注释。

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

A constraint declaration can be placed on an interface. For a given class, constraint declarations held on super- classes as well as interfaces are evaluated by the Bean Validation provider. Rules are formally described in Section 3.4.5. The effect of constraint declarations is cumulative. Constraints declared on a superclass getter will be validated along with any constraints defined on an overridden version of the getter according to the Java Language Specification visibility rules. 可以在接口上放置约束声明。对于给定的类, 超类和接口上的约束声明是 由Bean验证提供者进行评估。规则在中进行了正式描述 第3.4.5节。 约束声明的效果是累积的。声明的约束 在超类上,getter将与定义的任何约束一起进行验证 在根据Java语言重写的getter版本上 规范可见性规则。
为了记录在案,我为我的问题找到了一条旁路:

public class TestSizeAnnotation
{
    public static void main(String[] args)
    {
        System.out.println("c " + 
                Validation.buildDefaultValidatorFactory().getValidator().validate(new C(), Default.class, SizeGroup2.class));
        System.out.println("p " + 
                Validation.buildDefaultValidatorFactory().getValidator().validate(new P(), Default.class, SizeGroup.class));
    }
    public static interface SizeGroup {}
    public static interface SizeGroup2 {}
    public static class P 
    {
        private List<String> lst = newArrayList("AA");
        @Size(max=0, message="P" , groups=SizeGroup.class)
        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", groups=SizeGroup2.class)
        public List<String> getLst()
        {
            return super.getLst();
        }

    }
}
public类testsizeanotation
{
公共静态void main(字符串[]args)
{
System.out.println(“c”+
Validation.buildDefaultValidatorFactory();
System.out.println(“p”+
Validation.buildDefaultValidatorFactory();
}
公共静态接口SizeGroup{}
公共静态接口SizeGroup2{}
公共静态类P
{
私有列表lst=newArrayList(“AA”);
@大小(max=0,message=“P”,groups=SizeGroup.class)
公共列表getLst()
{
返回lst;
}
公共无效集合lst(列表lst)
{
这是1.lst=lst;
}
}
公共静态类C扩展了P
{
@凌驾
@大小(max=5,message=“C”,groups=SizeGroup2.class)
公共列表getLst()
{
返回super.getLst();
}
}
}

不,我想使用默认验证器,但要覆盖注释。正如Perception在他的回答中所说的,不,你不能在代码中覆盖它们。这不是覆盖,而是累积。在这种情况下,如果第二次验证通过,则初始验证将始终通过,但在其他情况下,例如,初始验证为最小值(…),然后将最大值(…)添加到覆盖方法中,将使其同时使用最小值和最大值验证(最大值不会覆盖初始最小值).这意味着我不能在超类中重写@NotNull,对吗?谢谢