Solución:
Para que la validación del bean JSR-303 funcione en Spring, necesita varias cosas:
- Configuración del espacio de nombres MVC para anotaciones:
<mvc:annotation-driven />
- El tarro de especificaciones JSR-303:
validation-api-1.0.0.GA.jar
(parece que ya lo tienes) - Una implementación de la especificación, como Hibernate Validation, que parece ser el ejemplo más utilizado:
hibernate-validator-4.1.0.Final.jar
- En el bean a validar, anotaciones de validación, ya sea del JAR de especificación o del JAR de implementación (que ya ha hecho)
- En el controlador que desea validar, anote el objeto con el que desea validar
@Valid
y luego incluir unBindingResult
en la firma del método para capturar errores.
Ejemplo:
@RequestMapping("handler.do")
public String myHandler(@Valid @ModelAttribute("form") SomeFormBean myForm, BindingResult result, Model model) {
if(result.hasErrors()) {
...your error handling...
} else {
...your non-error handling....
}
}
Debe usar Validator para verificar si su clase es válida.
Person person = ....;
ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
validator = factory.getValidator();
Set<ConstraintViolation<Person>> violations = validator.validate(person);
Luego, iterando el conjunto de infracciones, puede encontrar infracciones.
usted tendría que llamar a un Validador en la Entidad si desea validarla. Luego obtendrá un conjunto de ConstraintViolationException, que básicamente muestre para qué campo (s) de su entidad hay una violación de restricción y qué fue exactamente. Quizás también puedas compartir parte del código que esperas para validar tu entidad.
Una técnica de uso frecuente es realizar la validación en @PrePersist y deshacer la transacción si se utilizan varias modificaciones de datos durante la transacción o realizar otras acciones cuando se obtiene una excepción de validación.
Tu código debería ser así:
@PrePersist
public void prePersist(SomeEntity someEntity){
Validator validator = Validation.buildDefaultValidatorFactory.getValidator();
Set<ConstraintViolation<SomeEntity>> = validator.validate(someEntity);
//do stuff with them, like notify client what was the wrong field, log them, or, if empty, be happy
}