can I override a jsr-303 validation annotation

annotations, bean-validation, hibernate, java

Solution

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.

Problem

I have a test like below: ``` 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(); } } } ``` with the following output: `[ConstraintViolationImpl{interpolatedMessage='P', propertyPath=lst, rootBeanClass=class com....validator.TestSizeAnnotation$C, messageTemplate='P'}]` However, I expected that the annotation can `@Size` be overridden, and no warning will appear. Is there a way to accomplish that? EDIT: I found a bug seems related to that, but I run 4.2.0 final and still get the above behavior.

Original source