2012-01-30 4 views
9

У меня есть тест, как показано ниже:можно переопределить JSR-303 проверки аннотацию

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 быть переопределены, и никаких предупреждений не появится.
Есть ли способ сделать это?

EDIT: Я нашел bug, похоже, связано с этим, но я запустил 4.2.0 final и все еще получаю вышеуказанное поведение.

ответ

12

Переопределение аннотаций проверки фактически не поддерживается для 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. 
3

Вы можете ovveride аннотацию настроена проверка с помощью конфигурации XML:

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

В вашем случае, если вы объявляете различные проверки (или нет проверки) для GetList() methid в validation.xml файл, он переопределит аннотацию @Size.

+0

нет , Я хочу использовать валидатор по умолчанию, но переопределить аннотацию. – oshai

+0

Извините, теперь я понимаю, что вы имеете в виду. Я отредактировал свой ответ. –

+0

Спасибо, есть ли способ сделать это в коде? – oshai

1

Просто для записи, я нашел обходной для моей проблемы:

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

    } 
} 
+1

Это не переопределение, это совокупное. В этом случае начальная проверка всегда будет проходить, если вторая проверка будет проходить, но в других случаях, где, например, начальная проверка является Min (...), а затем вы добавляете Max (...) в метод переопределения, будет ли он использоваться как для проверки Min, так и для Max (Max не будет переопределять начальную Min). –

Смежные вопросы