jsf - configurar - ¿Cómo instalar y usar CDI en Tomcat?
configurar tomcat para jsf (2)
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
<html ...>
<f:loadBundle basename="i18n" var="bundle" />
<h:head>
<title>#{bundle[''index_title'']}</title>
</h:head>
<h:body>
#{bundle[''index_appname'']}
<br />
<h:form id="frmIndex">
<p:panelGrid columns="2">
<p:outputLabel for="user" value="#{bundle[''lblUser'']}" />
<p:inputText id="user" value="#{indexMB.user}" />
<p:outputLabel for="password" value="#{bundle[''lblPassword'']}" />
<p:password id="password" value="#{indexMB.password}" />
</p:panelGrid>
<p:commandButton action="#{indexMB.loginTest}" value="#{bundle[''btn_login'']}" />
</h:form>
</h:body>
faces-config.xml
<?xml version=''1.0'' encoding=''UTF-8''?>
<faces-config version="2.2"
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-facesconfig_2_2.xsd">
<application>
<locale-config>
<default-locale>pt_BR</default-locale>
<supported-locale>en</supported-locale>
<supported-locale>fr</supported-locale>
</locale-config>
</application>
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/
Otra opción posible es dejar beans.xml
en su implementación.
Tomcat como un contenedor barebones JSP / Servlet no admite CDI fuera de la caja. ¿Cómo instaló exactamente CDI? ¿De verdad javaee-api-7.0.jar
en /WEB-INF/lib
solo para obtener tu código para compilar? 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:
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 objetivo 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.
<dependency> <groupId>javax</groupId> <artifactId>javaee-web-api</artifactId> <version><!-- 7.0 (TomEE 7.x) or 6.0 (TomEE 1.x) --></version> <scope>provided</scope> </dependency>
Tenga en cuenta la importancia de
provided
y su significado como en "el tiempo de ejecución objetivo ya proporciona esto fuera de la caja". Vea también nuestra página wiki de JSF .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:
Suelta el
weld-servlet-shaded.jar
enweld-servlet-shaded.jar
/WEB-INF/lib
. En caso de que esté usando Maven, use esta coordenada :<dependency> <groupId>org.jboss.weld.servlet</groupId> <artifactId>weld-servlet-shaded</artifactId> <version>3.0.3.Final</version> </dependency>
Cree el archivo
/META-INF/context.xml
en la aplicación web con el siguiente contenido:<Context> <Resource name="BeanManager" auth="Container" type="javax.enterprise.inject.spi.BeanManager" factory="org.jboss.weld.resources.ManagerObjectFactory"/> </Context>
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.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 .