2011-12-06 10 views
7

Quiero poner un conjunto de restricciones estándar (como cadena alfanumérica no nula con una longitud de 3 a 240 caracteres) en los campos (Cadena en este caso) y quiero saber si hay alguna manera de anular algunas de esta restricción en el código modelo. Además, ¿será esto una anulación, o simplemente una validación dos veces para la anotación sobrescrita?JSR 303 Restricción personalizada Anular

que debería ser algo como esto

@AlphanumericString 
@Size(min=100, max=150) //override standart values from AlphanumericString annotation 

gracias por te responde

bien, responder a mí mismo. hay @OverridesParameter tendiendo a reasignar anidada parámetro anotación

@Numerical 
@Size //arbitrary parameter values 
@ConstraintValidator(FrenchZipcodeValidator.class) 
@Documented 
@Target({ANNOTATION_TYPE, METHOD, FIELD}) 
@Retention(RUNTIME) 
public @interface FrenchZipCode { 
    String message() default "Wrong zipcode"; 
    String[] groups() default {}; 

    @OverridesParameters({ 
     @OverridesParameter(constraint=Size.class, parameter="min") 
     @OverridesParameter(constraint=Size.class, parameter="max") }) 
    int size() default 5; 

    @OverridesParameter(constraint=Size.class, parameter="message") 
    String sizeMessage() default "{error.zipcode.size}"; 

    @OverridesParameter(constraint=Numerical.class, parameter="message") 
    String numericalMessage() default "{error.zipcode.numerical}"; 
} 

source

Respuesta

5

Es una buena pregunta. El JSR 303 Bean Validation specification describe la rutina de validación en la sección 3.5.

Para un grupo dado para validar, la rutina de validación aplicado en una instancia del bean dado se espera para ejecutar la siguiente restricción validaciones en ningún orden en particular:

  • para todos los campos alcanzables, ejecutar todas validaciones de nivel de campo (incluidas las expresadas en superclases) que coincidan con el grupo específico a menos que la restricción de validación dada ya haya sido procesada durante esta rutina de validación para una ruta de navegación dada (ver Sección 3.5.1) como parte de un partido de grupo.

...

La rutina de validación objeto se describe como tal. Para cada declaración restricción:

  • determinar por la declaración de limitación, la ConstraintValidator apropiado utilizar (véase la Sección 3.5.3).
  • ejecutar la operación isValid (a partir de la puesta en práctica validación restringida) en los datos apropiados (véase la sección 2.4)
  • si isValid devuelve verdadero, continúe con la siguiente restricción,
  • si isValid devuelve false, los puebla proveedor Bean Validation Restrinja los objetos de acuerdo con las reglas definidas en la Sección 2.4 y anexa estos objetos a la lista de violaciones de restricciones.

En su caso, que se ocupan de la validación de un simple campo de String donde el grupo objetivo es Default. Tiene dos restricciones de validación (@AlphanumericString y @Size) que según la documentación se validarán/procesarán por separado sin un orden en particular.

Para responder a su pregunta. No, no se aplicará ninguna anulación a su @AlphanumericString cuando utiliza @Size adicionalmente.Para ser capaz de lograr lo que creo que intenta hacerlo, es posible crear una composición restricción donde overridde atributos de componer anotaciones por el estilo:

@Pattern(regexp="[a-zA-Z]*") 
@Size 
@Constraint(validatedBy = AlphanumericStringValidator.class) 
@Documented 
@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER }) 
@Retention(RUNTIME) 
public @interface AlphanumericString { 
    // ... 
    @OverridesAttribute(constraint=Size.class, name="min") 
    int min() default 3 
    @OverridesAttribute(constraint=Size.class, name="max") 
    int max() default 230;  
    // ... 
} 

y utilizarlo como esa:

@AlphanumericString(min = 100, max = 150) 
+0

Gracias, intenté utilizar este método, ¿podría sugerirme una forma de acelerar la validación, que no sea instanciar la fábrica de validadores solo una vez por aplicación, dividir la validación en grupos y ordenarlos de tiempos de procesamiento más rápidos a más lentos? – Pilgrim

Cuestiones relacionadas