openxava / documentación / Lección 23: Atributos en anotaciones

Curso: 1. Primeros pasos | 2. Modelo básico del dominio (1) | 3. Modelo básico del dominio (2) | 4. Refinar la interfaz de usuario | 5. Desarrollo ágil | 6. Herencia de superclases mapedas | 7. Herencia de entidades | 8. Herencia de vistas | 9. Propiedades Java | 10. Propiedades calculadas | 11. @DefaultValueCalculator en colecciones | 12. @Calculation y totales de colección | 13. @DefaultValueCalculator desde archivo | 14. Evolución del esquema manual | 15. Cálculo de valor por defecto multiusuario | 16. Sincronizar propiedades persistentes y calculadas | 17. Lógica desde la base de datos | 18. Validando con @EntityValidator | 19. Alternativas de validación  | 20. Validación al borrar  21. Anotación Bean Validation propia | 22. Llamada REST desde una validación | 23. Atributos en anotaciones24. Refinar el comportamiento predefinido | 25. Comportamiento y lógica de negocio | 26. Referencias y colecciones | A. Arquitectura y filosofía | B. Java Persistence API | C. Anotaciones | D. Pruebas automáticas

Tabla de contenidos

Lección 23: Atributos en anotaciones
Añadir atributos a tu anotación
Resumen
En la lección anterior aprendiste como llamar a un servicio REST para validar el ISBN. En esta lección vas a aprender a como añadir atributos a tu anotación.

Si no te gustan los videos sigue las instrucciones a continuación.

Añadir atributos a tu anotación

Creas una anotación Bean Validation cuando quieres reutilizar la validación varias veces, usualmente en varios proyectos. En este caso, necesitas hacer tu validación adaptable, para que sea reutilizable de verdad. Por ejemplo, en el proyecto actual buscar en openlibrary.org el ISBN es conveniente, pero en otro proyecto, o incluso en otra entidad de tu actual proyecto, puede que no quieras hacer esa búsqueda. Necesitas hacer tu anotación más flexible.
La forma de añadir esta flexibilidad a tu anotación de validación es mediante los atributos. Por ejemplo, podemos añadir un atributo de búsqueda booleano a nuestra anotación ISBN para poder escoger si queremos buscar el ISBN en internet para validar o no. Para hacerlo, simplemente añade el atributo buscar al código de la anotación ISBN que se encuentra en el paquete de la carpeta com.tuempresa.facturacion.anotaciones, tal como muestra el siguiente código:
public @interface ISBN {
    
    boolean buscar() default true; // Para (des)activar la búsqueda web al validar
    // ... el resto del código
}
Este nuevo atributo buscar puede leerse de la clase validador que se encuentra en la carpeta com.tuempresa.facturacion.validadores. Míra como modificarlo:
public class ValidadorISBN implements ConstraintValidator<ISBN, Object> {
    // ...
    private boolean buscar; // Almacena la opción buscar
 
    public void initialize(ISBN isbn) { // Lee los atributos de la anotación
        this.buscar = isbn.buscar();
    }
 
    public boolean isValid(Object valor, ConstraintValidatorContext contexto) {
        if (Is.empty(valor)) return true;
        if (!validador.isValid(valor.toString())) return false;
        return buscar ? existeISBN(valor) : true; // Usa 'buscar'
    }
    // ...
}
Aquí ves la utilidad del método initialize(), que lee la anotación para inicializar el validador. En este caso simplemente almacenamos el valor de isbn.buscar() para preguntar por él en isValid().
Ahora puedes escoger si quieres llamar a nuestro servicio REST o no para hacer la validación ISBN. Mira como:
public class Producto {
//...

@ISBN(buscar=false) // En este caso no se hace una búsqueda en la web para validar el ISBN private String isbn;

//...
}
Ahora prueba la aplicación y verás que la validación no se ejecuta.

Resumen

¡Enhorabuena! Has aprendido a añadir atributos a tu anotación. En estas últimas has aprendido varias formas de hacer validación en una aplicación OpenXava. Además, ahora estás preparado para encapsular toda la lógica de validación reutilizable en anotaciones usando Bean Validation.
La validación es una parte importante de la lógica de tu aplicación y te ánimo a que la pongas en el modelo, es decir en las entidades; tal y como estas últimas lecciones han mostrado. Aun así, a veces es conveniente poner algo de lógica fuera de las clases del modelo. Aprenderás a hacer esto en las siguientes lecciones.

Descargar código fuente de esta lección

¿Problemas con la lección? Pregunta en el foro ¿Ha ido bien? Ve a lección 24