can I override a jsr-303 validation annotation

做~自己de王妃 提交于 2019-11-27 23:06:00

Overriding validation annotations is actually not supported for JSR-303. Instead annotations on overridden methods in the subclass will be applied cumulatively: From section 3.3 of the specification:

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.

You can ovveride an annotation configured validation via xml configuration:

http://docs.jboss.org/hibernate/validator/4.2/reference/en-US/html_single/#validator-xmlconfiguration

In your case, if you declare a different validation (or no validation) for the getList() methid in the validation.xml file, it will override the @Size annotation.

Just for the records, I have found a bypass for my problem:

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();
        }

    }
}
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!