Bean Validation y Java SE

por | enero 31, 2013

Para definir lo que es Bean Validation, me remito a la wikipedia:

En el contexto de Java Bean Validation (JSR 303) es un framework aprobado en los marcos de JCP al 16 de noviembre de 2009, siendo aceptado como parte de la especificación Java EE 6. Bean Validation define un modelo de metadatos y una interfaz para la validación de JavaBeans. La fuente de los metadatos consiste en anotaciones, con la posibilidad de sobreescribir y extender estos metadatos por medio del uso de descriptores de validación en formato XML[…].

Surge la necesidad de implementar una serie de validaciones en una aplicación Java SE, concretamente un plugin para una aplicación base de Eclipse RCP, es cuando se me vino a la mente usar Bean Validation para definir las validaciones si se puede decir, comunes, valores no nulos, mínimos, máximos, longitudes y las más que necesarias expresiones regulares, Bean Validation va a resolver en gran medida esta necesidad. Para luego centrarme en lo que son validaciones específicas del negocio.

Las librerías que fueron necesarias para integrar Bean Validation en mi aplicación Java SE son:

  • validation-api-1.0.0.GA
  • hibernate-validator-4.0.2.GA

Como ven librerías del API y del proveedor, en este caso hibernate.

Estas librerías fueron necesarias porque hibernate escribe mucho log 🙂

  • log4j-1.2.12
  • slf4j-api-1.4.2
  • slf4j-simple-1.4.2

Para este ejemplo se crea una Java Project desde el asistente de Eclipse.

Y se escribe el pojo, bastante sencillo para el ejemplo, pero como saben, se puede completar y complicar como queramos.

[java]
public class Cliente {
@NotNull(message="La info es obligatoria")
private String tipoIdCliente;
@NotNull(message="La info es obligatoria")
@Length(min=10, max=10, message="El campo no tiene la longitud adecuada")
private String idCliente;
@NotNull(message="La info es obligatoria")
@Email(message="El email es incorrecto")
private String email;

//setters and getters
}
[/java]

Y para probar una clase con un método main.

[java]
public static void main(String[] args) {
//creamos nuestro cliente
Cliente c = new Cliente();
//fallamos algunas validaciones
c.setIdCliente("123456789");
c.setTipoIdCliente(null);
c.setEmail("mailinvalido@");

//creamos el factory para lanzar la validacion
ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
Validator validator = factory.getValidator();
Set<ConstraintViolation<Cliente>> violations = validator.validate(c);

//recorremos y mostramos los mensajes
for(ConstraintViolation<Cliente> cv : violations) {
System.out.println(cv.getPropertyPath() + " -> " +
cv.getMessage() + " " + cv.getMessageTemplate());
}
}
[/java]

Como se puede ver, se necesita un ValidatorFactory y un Validator, al cual le pasamos nuestro objeto a validar al método validate(), el cual nos devuelve una lista de ConstraintViolation, la recorremos y mostramos los mensajes, getPropertyPath devuelve la propiedad que esta afectada por la validación y getMessage muestra el mensaje que especificamos.

Este es log que se puede ver a la salida:

[shell]
2 [main] INFO org.hibernate.validator.util.Version –
Hibernate Validator 4.0.2.GA
email -> El email es incorrecto El email es incorrecto
tipoIdCliente -> La info es obligatoria La info es obligatoria
idCliente -> El campo no tiene la longitud adecuada
El campo no tiene la longitud adecuada
[/shell]

Bastante sencillo ¿verdad?. Hasta aquí este post, queda por demás adecuarlo a las necesidades y tendremos mejor estructurada nuestras validaciones con la ayuda de la excepcional api Bean Validation.

Para descargar el proyecto: BeanValidation
El proyecto esta sin las librerías, las pueden descargar aquí, descomprimirlas y colocarlas dentro del proyecto, luego desde eclipse agregarlas al ambiente.

Referencias y más información:
http://java.dzone.com/articles/bean-validation-made-simple

.