2012-03-02 8 views
6

tengo el siguiente problema mientras se trabaja con jsr303:Si utilizo dos anotaciones personalizadas en jsr 303, ¿cómo detener la validación para la segunda anotación si la validación falló primero?

que tengo anotado campo de la siguiente manera:

@NotEmpty(message = "Please specify your post code") 
@PostCode(message = "Your post code is incorrect") 
private String postCode; 

Pero tengo que comprobar @PostCode sólo si el campo pasó la validación para @NotEmpty. ¿Cómo puedo verificar tese dos anotaciones? Gracias de antemano

Respuesta

2

Puede usar grupos de validación para ejecutar validaciones en grupo. Para más detalles, consulte la sección 3.4. Secuencia de grupo y grupo en JSR-303. En su muestra que haría algo como:

@NotEmpty(message = "Please specify your post code") 
@PostCode(message = "Your post code is incorrect", groups = Extended.class) 
private String postCode; 

Y al validar que llamarían validación para el grupo predeterminado, entonces si se han producido errores, para el grupo Extended.

Validator validator = factory.getValidator(); 

Set<ConstraintViolation<MyClass>> constraintViolations = validator.validate(myClass, Default.class); 

if (constraintViolations.isEmpty()) { 
    constraintViolations = validator.validate(myClass, Extended.class); 
} 

Puede hacer mucho más utilizando grupos de validación.

Una alternativa sería hacer todas las validaciones (si puede pagarlas), y luego filtrar manualmente múltiples errores de validación para el mismo campo.

+0

¿Pero qué sucede si agrego una anotación más? Debo agregar un nuevo grupo? ¿Y qué ocurre si tengo varios campos y Set > no estaría vacío porque la validación de otros campos falló? – user1240290

+0

Luego necesita determinar el campo de origen de sus violaciones de restricciones inspeccionando sus objetos ConstraintViolation y mejor utilice la segunda alternativa que sugerí. – MicSim

+0

¿Y puedo gestionar la secuencia en la que se llaman los validadores? Por ejemplo, para hacer que la primera anotación se anote primero, luego la segunda y así sucesivamente. – user1240290

1

Así que después de largas investigaciones me encontré con una cosa:

si utiliza diferentes validadores, usted tiene que asegurarse de que no comprueban la misma regla. Por ejemplo, si escribo @PostCode, debo asegurarme de que el valor vacío sea válido para esta anotación. En este caso, recibiré el mensaje que esperaba. ¿Entonces el validador debe verificar solo una pequeña parte de la lógica? otros valores tienen que ser válido ...

Si no se puede evitar esto, la mejor manera es realmente utilizar grupos para algunas situaciones de desorden ..

esperanza de que ayudaría a alguien ....

Cuestiones relacionadas