¿Cómo hacer referencia a los beans administrados JSF que se proporcionan en un archivo JAR?

Tengo un archivo WAR con la siguiente estructura:

enter image description here

El bean gestionado JSF BusinessObjectTypeListController se encuentra en commons-web-1.0.jar en /WEB-INF/lib y se hace referencia en BusinessObjectTypeListView.xhtml . Cuando ejecuto mi aplicación web y llamo a esa vista, aparece el siguiente error:

javax.servlet.ServletException: /view/common/businessObjectTypeListView.xhtml @ 34,94 listener = “# {businessObjectTypeListController.selectData}”: Target inalcanzable, identificador ‘businessObjectTypeListController’ resuelto a nulo

¿Por qué no se encuentra la clase de controlador? Debería estar en el classpath, ¿o sí?

Necesita tener un archivo /META-INF/faces-config.xml compatible con JSF 2.0 en el archivo commons-web-1.0.jar para que JSF escanee el archivo JAR para las clases con anotaciones JSF como @ManagedBean y auto- registrarlos.

 < ?xml version="1.0" encoding="UTF-8"?>   

JSF hace, concretamente, no escanea cada clase de cada archivo JAR en la ruta de clase, eso hubiera sido demasiado caro. Solo se /META-INF/faces-config.xml los /META-INF/faces-config.xml con el archivo /META-INF/faces-config.xml anterior.

También debe asegurarse de no tener el atributo metadata-complete="true" en la statement del archivo /WEB-INF/faces-config.xml propio de /WEB-INF/faces-config.xml ; de lo contrario, JSF asumirá que esto se enfrenta a la configuración completo y por lo tanto no escaneará automáticamente los archivos JAR para las anotaciones.

Si ninguna de esas condiciones se cumple (o puede cumplirse), entonces necesita registrar manualmente el bean como en el / /WEB-INF/faces-config.xml de /WEB-INF/faces-config.xml lugar de confiar en las anotaciones.

Ver también el capítulo 11.4.2 de la especificación JSF 2.0 (énfasis mío).

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 progtwigción con la aplicación ejemplo. Además, la aplicación puede elegir incluir una biblioteca de componentes (empaquetada como un archivo JAR) que incluya 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.

Tengo el mismo problema con los frijoles CDI en mi caso.

Tengo proyecto common.jar donde puse los beans CDI. (sin beans.xml) y tengo webapp.war que contiene common.jar en it`s lib y beans.xml.

cuando llamo a un cdi bean de jsf, entiendo que no es una excepción accesible: /

la estructura del proyecto se crea utilizando maven: – maven-archetype-quickstart para common.jar – maven-archetype-webapp para webapp.war

Estoy usando eclipse / juno en deploy para Glassfish 3.1.x.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Resuelto: Para los paquetes EJB y JAR, debe colocar beans.xml en src / main / resources / META-INF /. Para el empaquetado WAR, debe colocar beans.xml en src / main / webapp / WEB-INF /. Recuerde que solo los archivos .java deben colocarse en los directorios src / main / java y src / test / java. Los recursos como los archivos .xml deben estar en src / main / resources.

del tema: CDI: beans.xml, ¿dónde te pongo?

En mi opinión, la clase BusinessObjectTypeListController está fundada correctamente, pero no está instanciada.

¿Cómo se crea la instancia de clase en una vista? Si usa BeanFactory, revise los archivos config xml