martes, septiembre 11, 2007

Validación en Java: Oval, una joya escondida

martes, septiembre 11, 2007 por Martín

Hay veces que los frameworks menos conocidos te dan una sorpresa en cuanto elegancia y funcionalidad. Es el caso de Oval, un framework de validación de objetos para Java realmente recomendable.

La idea de este framework es definir los requisitos del modelo de objetos de nuestra aplicación para posteriormente utilizar Oval para que realice la validación. Las restricciones sobre el modelo se definen mediante anotaciones, mientras que la validación se puede realizar de manera programática o automática.

El siguiente código muestra una clase anotada:

public class BOFieldObject
@NotNull
@NotEmpty
@Length(max=32)
private String name;

...


Para validar el objeto anterior sería muy sencillo:


Validator validator = new Validator();
BOFieldObject bo = new BOFieldObject();

List violations = validator.validate(bo);


Realmente simple, ¿verdad? La siguiente lista muestra lo que personalmente me gusta más de este framework:


  • Permite el diseño por contrato. Para ello utiliza AspectJ y escapaz de forzar las restricciones tanto en los constructores como en los parámetros y valores de retorno de los métodos de las clases de modo que se pueden especificar fácilmente precondiciones y postcondiciones.
  • Soporta herencia en las anotaciones (aunque curiosamente todavía no se pueden declarar anotaciones en interfaces).

  • Soporta la creación de anotaciones complejas tanto utilizando Java como lenguajes de scripting como groovy, beanshell o javascript por ejemplo.

  • Se pueden crear anotaciones propias.

  • Se pueden anotar las clases con las anotaciones definidas en JPA. Oval es capaz de interpretar estas anotaciones y las traducirá internamente a sus propias anotaciones.

  • Soporta perfiles de modo que puedes asociar una restricción con uno o varios perfiles. De este modo se pueden ejecutar diferentes validaciones en diferentes escenarios (ej. UI, web, app server, etc.)



La verdad es que he estado comparando este producto con otro framework que en teoría debería ser mucho mejor como hibernate-validator, y lo cierto es que Oval es realmente muchísimo mejor y la mayoría de las funcionalidades que he describido en la lista anterior no las soporta el framework de Hibernate, aunque justo es decir que el primero tiene alguna funcionalidad como la validación en base de datos que a Oval le falta.

En cuanto a rendimiento también funciona muy bien. De hecho, creo que no hay excusa para utilizar un framework como este. En algún pequeño benchmark que he hecho me salía un overhead de 0.03 milisegundos al evaluar un objeto con 53 anotaciones diferentes respecto a lo que sería la instanciación normal del objeto sin validación. Al añadir aspectos a la validación, el overhead pasó a ser tan sólo de 0.05 milisegundos.

En fin, que es realmente una pena que frameworks como este, muy superiores a los que están en Hibernate o Spring no se conozcan más, porque realmente creo que se merece ser más conocido.

Por cierto, ¿Alguién lo conocía o lo ha usado?

comments

2 Respuestas a "Validación en Java: Oval, una joya escondida"
cclafuente dijo...
14:24

Lo que no logro encontrar es un ejemplo de una webapp o una aplicación simple con validaciones OVal, creo que se echa de menos del framework.


Martín dijo...
14:38

No sé si te refieres en una webapp a validar los formularios como se puede hacer con Seam y hibernate-validator. Oval no soporta ese tipo de integración.

Si te refieres a ejemplos simples, la verdad es que yo simplemente seguí el tutorial de la página principal. Es simplemente cuestión de seguir todos los pasos e ir creando tus clases de prueba.

Saludos.