route que outcome example ejemplo bean java annotations jsf-2 managed-bean

java - outcome - que es un bean en netbeans



¿Cómo encuentra JSF beans anotados con @ManagedBean? (2)

Por lo que sé, para usar @Annotations (o [Attributes] en C #) debe tener una referencia a los metadatos de la clase, para que pueda preguntar si la clase está anotada (atribuida) o no.

Mi pregunta es ¿cómo la implementación de JSF encuentra todas las clases anotadas con @ManagedBean? ¿Escanea todas las clases en la ruta de clase? ¿O hay una manera de realmente "consultar" la JVM para las clases anotadas?

Estoy preguntando esto porque cuando pongo mis respaldos anotados directamente en mi proyecto web, no hay problema. Pero los beans que defino en los archivos JAR (para ser reutilizables en los proyectos) no están registrados. ¿Hay algo que le tenga que decir a MyFaces que lo dirija a qué archivos JAR mirar?

Además, el uso de anotaciones presenta muchos patrones agradables de programación. Quiero saber si puedo encontrar todas las clases anotadas de alguna manera ...


En realidad, el contenedor escanea todas las clases dentro del archivo WAR actual. Escanear todo el classpath sería muy largo y costoso.

Es por eso que puede poner sus beans administrados anotados dentro del archivo WAR, y no en un archivo JAR.

Si realmente necesita colocar sus clases en un archivo JAR en el classpath, puede usar el archivo faces-config.xml para decirle a JSF qué clases se administran.


Mi pregunta es ¿cómo la implementación de JSF encuentra todas las clases anotadas con @ManagedBean? ¿Escanea todas las clases en la ruta de clase? ¿O hay una manera de realmente "consultar" la JVM para las clases anotadas?

Empieza mirando en com.sun.faces.application.annotation.AnnotationManager en las fuentes de Mojarra . Tenga en cuenta que esto no es parte de la API, sino específico de la implementación.

Si tiene la intención de utilizar dichas herramientas para sus propios proyectos, le recomiendo usar Reflections para esto en lugar de hacerlo en su propio hogar.

Set<Class<?>> classes = reflections.getTypesAnnotatedWith(SomeAnnotation.class);

En un entorno Java EE, mejor aún es usar CDI en su lugar.

Estoy preguntando esto porque cuando pongo mis respaldos anotados directamente en mi proyecto web, no hay problema. Pero los beans que defino en los archivos JAR (para ser reutilizables en los proyectos) no están registrados. ¿Hay algo que le tenga que decir a MyFaces que lo dirija a qué archivos JAR mirar?

Para que JSF cargue los beans administrados anotados de un archivo JAR, debe colocar un archivo /META-INF/faces-config.xml en el archivo JAR. Solo una declaración <faces-config> compatible con JSF 2.0 es suficiente para hacer que JSF escanee el archivo JAR para cualquier clase anotada interesante. Si el archivo /META-INF/faces-config.xml no está presente en el archivo JAR, entonces JSF no escaneará el archivo JAR para mejorar el rendimiento de la carga.

Así es como se ve un archivo faces-config.xml compatible con JSF 2.0 mínimo:

<?xml version="1.0" encoding="UTF-8"?> <faces-config xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_2_0.xsd" version="2.0"> </faces-config>

Guárdelo en la carpeta META-INF del JAR.

Por cierto, esto se describe en el capítulo 11.4.2 de la especificación JSF 2.0 .

11.4.2 Comportamiento de inicio de la aplicación

...

Este algoritmo proporciona una flexibilidad considerable para los desarrolladores que están ensamblando los componentes de una aplicación web basada en JSF. Por ejemplo, una aplicación puede incluir una o más implementaciones de UIComponent personalizadas, junto con procesadores asociados, para que pueda declararlas en un recurso de aplicación llamado "/WEB-INF/faces-config.xml" sin necesidad de registrarlas mediante programación con la aplicación ejemplo. Además, la aplicación puede elegir incluir una biblioteca de componentes (empaquetada como un archivo JAR) que incluye un recurso "META-INF / faces-config.xml". La existencia de este recurso hace que los componentes, procesadores y otras clases de implementación de JSF que se almacenan en este archivo JAR de la biblioteca se registren automáticamente, sin que la aplicación requiera ninguna acción.

Ver también: