¿Cómo instalar y usar CDI en Tomcat?

Estoy creando mi primer proyecto Java EE 7, pero estoy teniendo problemas. Aprecia cualquier ayuda.

  • Tomcat 7.0.34
  • JSF 2.2
  • Primeras caras 3.5
  • javaee-api-7.0.jar

Cuando se inicia la aplicación, el registro de Tomcat muestra el siguiente mensaje:

"validateJarFile (C:\...\build\web\WEB-INF\lib\javaee-api-7.0.jar)-jar not loaded. See Servlet 2.3 Spec, section 9.7.2. Offending class: javax/servlet/Servlet .class" 

cuando hago clic en el botón que llama al bean administrado, aparece el error:

 Advertência: /index.xhtml @18,66 value="#{indexMB.user}": Target Unreachable, identifier 'indexMB' resolved to null javax.el.PropertyNotFoundException: /index.xhtml @18,66 value="#{indexMB.user}": Target Unreachable, identifier 'indexMB' resolved to null 

IndexMB

 @Named("indexMB") @RequestScoped public class IndexMB { private String password; private String user; public String loginTest(){ return (this.user.equals("admin") ? "adminPage" : "inOutPage"); } // getters and setters } 

index.xhtml

    #{bundle['index_title']}   #{bundle['index_appname']} 

faces-config.xml

     pt_BR en fr   

Estos temas no me han ayudado:

  • Java EE 6 @ javax.annotation.ManagedBean vs. @ javax.inject.Named vs. @ javax.faces.ManagedBean
  • Identificador de destino inalcanzable resuelto a nulo
  • Destino inalcanzable, identificador resuelto a nulo
  • javax.el.PropertyNotFoundException: Target inalcanzable, identificador ‘login’ resuelto para anular Spring + JSF
  • http://www.andrejkoelewijn.com/blog/2010/03/05/jee-cdi-tip-target-unreachable-identifier-resolved-to-null/

Tomcat como un contenedor barebones JSP / Servlet no admite CDI fuera de la caja. ¿Cómo instaló exactamente CDI? ¿De verdad javaee-api.jar en /WEB-INF/lib solo para obtener tu código para comstackr? Oh, por favor, no, esta no es la manera correcta. El JAR de Java EE API contiene únicamente las clases API, no la implementación concreta. Deshazte de todo el JAR. Puede causar muchos otros problemas de portabilidad como los que se describen en esta respuesta: ¿Cómo importo la API javax.servlet en mi proyecto Eclipse? En realidad, debería instalar la implementación concreta junto con la API específica.

Tienes 2 opciones:

  1. Suelta Tomcat y elige un verdadero contenedor Java EE. Como usas Tomcat, simplemente pasa a TomEE . Es realmente simple, descargue el archivo zip del perfil web TomEE , extráigalo e integrelo en Eclipse exactamente de la misma manera que lo hizo con Tomcat. No se olvide de eliminar el archivo JAR de Java EE de la aplicación web y alterar la propiedad del Tiempo de ejecución objective en las propiedades del proyecto de Tomcat a TomEE para que las dependencias de Java EE se resuelvan adecuadamente.

    No es necesario ningún JAR o configuración adicional. Incluso puede eliminar los archivos JAR de JSF de su aplicación web. TomEE como un verdadero contenedor Java EE ya proporciona, entre otros, JSF y CDI. En caso de que estés usando Maven, la siguiente coordenada es suficiente.

      javax javaee-web-api  provided  

    Tenga en cuenta la importancia de provided y su significado como en “el tiempo de ejecución objective ya proporciona esto fuera de la caja”. Consulte también ¿Cómo instalar y configurar correctamente las bibliotecas JSF a través de Maven? .


  2. Instale una implementación real de CDI en Tomcat. Weld es una de las implementaciones de CDI disponibles. En la guía de instalación de Weld , puede encontrar instrucciones sobre cómo integrarlo en Tomcat. En aras de la exhaustividad y la referencia futura, estos son los pasos:

    1. Suelta el weld-servlet-shaded.jar en weld-servlet-shaded.jar /WEB-INF/lib . En caso de que esté usando Maven, use esta coordenada :

        org.jboss.weld.servlet weld-servlet-shaded 3.0.5.Final  
    2. Cree el archivo /META-INF/context.xml en la aplicación web con el siguiente contenido:

          

      Tenga en cuenta que este paso no es estrictamente necesario cuando está utilizando Mojarra 2.2.11 o posterior, ya que podrá encontrarlo a través de ServletContext cuando esté ausente en JNDI.

    3. Cree un archivo /WEB-INF/beans.xml vacío en la aplicación web.

    Eso es todo (nota: en las versiones anteriores de Weld Servlet, necesitaría registrar explícitamente el administrador de beans CDI y el oyente Weld en web.xml también, pero eso no es necesario con las versiones actuales).

    En caso de que prefiera OpenWebBeans por encima de Weld como implementación de CDI, diríjase a este blog para obtener instrucciones de instalación detalladas de Maven: ¿Cómo instalar CDI en Tomcat?


Sin relación con el problema concreto, las API JSP / Servlet de Tomcat 7 no cumplen esas API de Java EE 7, en su lugar cumple con Java EE 6 (Servlet 3.0 / JSP 2.2). Si desea el equivalente de Tomcat de Java EE 7 (Servlet 3.1 / JSP 2.3), entonces debería estar buscando Tomcat 8. Consulte también la matriz de versiones de Apache Tomcat .

Otra opción posible es dejar beans.xml en su implementación.