2012-01-30 10 views
9

tengo una prueba, como a continuación:puedo anular un JSR-303 validación anotación

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

} 
} 

con el siguiente resultado:
[ConstraintViolationImpl{interpolatedMessage='P', propertyPath=lst, rootBeanClass=class com....validator.TestSizeAnnotation$C, messageTemplate='P'}]

Sin embargo, esperaba que la anotación puede @Size ser anulado, y no aparecerá ninguna advertencia.
¿Hay alguna manera de lograr eso?

EDIT: encontré un bug parece relacionado con eso, pero corro 4.2.0 final y sigo teniendo el comportamiento anterior.

Respuesta

12

Anular anotaciones de validación en realidad no es compatible con JSR-303. En lugar anotaciones sobre los métodos se reemplaza en la subclase se aplicarán acumulativamente: Desde la sección 3.3 de la especificación:

 
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

Puede ovveride una validación de anotación configurado a través de la configuración xml:

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

En su caso, si se declara una validación diferente (o ninguna validación) para la getList() methid en el validation.xml archivo, anulará la anotación @Size.

+0

sin , Quiero usar el validador predeterminado, pero anulo la anotación. – oshai

+0

Lo siento, ahora veo lo que quieres decir. He editado mi respuesta. –

+0

Gracias, ¿hay alguna manera de hacerlo en el código? – oshai

1

Sólo por los registros, he encontrado un bypass para mi problema:

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

Eso no es una anulación, eso es acumulativo. En este caso, la validación inicial siempre pasará si pasa la segunda validación, pero en otros casos, donde, por ejemplo, la validación inicial es Min (...) y luego se agrega Max (...) al método de anulación, usted Lo utilizará validación Min y Max (Max no anulará el Min inicial). –

Cuestiones relacionadas