Cómo instalar y utilizar la CDI en Tomcat?

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

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

Cuando el inicio de la aplicación, el Tomcat registro 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 a la managed bean, me sale 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
}

índice.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 han ayudado a mí:

Mostrar su faces-config.xml archivo
Gracias @Kalathoki, archivo agregado. Casi nada, porque yo estoy usando anotaciones.
asegúrese de indexMB bean es construido con éxito.

OriginalEl autor Rogério Arantes | 2013-09-25

2 Kommentare

  1. 57

    Tomcat como un simple JSP/Servlet container no admite CDI fuera de la caja. Cómo fue exactamente lo que usted instale el CDI? ¿De verdad gota javaee-api.jar en /WEB-INF/lib sólo para obtener su código para compilar? Oh por favor, no, este no es el camino correcto. El API Java EE FRASCO contiene únicamente la API de clases, no de la aplicación concreta. Deshacerse de todo el FRASCO. Puede causar muchos otros problemas de portabilidad, como los que se describen en esta respuesta: ¿Cómo puedo importar la javax.servlet API en mi proyecto de Eclipse? en realidad debería ser la instalación de la aplicación concreta, junto con la API específica.

    Tienes 2 opciones:

    1. Caída de Tomcat e ir a por un verdadero contenedor Java EE. Como usted está usando Tomcat, acaba de dar un paso más para TomEE. Es muy simple, descargar el TomEE perfil web archivo zip, extraer e integrar en Eclipse exactamente de la misma manera como se hizo para Tomcat. No te olvides de quitar el Java EE archivo JAR de la webapp y alterar el Dirigidos tiempo de ejecución de la propiedad en las propiedades del proyecto de Tomcat para TomEE para que Java EE dependencias están correctamente resueltos.

      No hay más Frascos o configuración es necesario. Usted puede incluso eliminar el JSF Frascos de su webapp. TomEE como un verdadero Java EE contenedor ya se dispone, entre otros, JSF y CDI fuera de la caja. En caso de que usted está usando Maven, de la siguiente coordenada es suficiente.

      <dependency>
          <groupId>javax</groupId>
          <artifactId>javaee-web-api</artifactId>
          <version><!-- 8.0 or 7.0 or 6.0 --></version>
          <scope>provided</scope>
      </dependency>

      Nota de la importancia de provided y su significado, como en «el tiempo de ejecución de destino ya proporciona esta fuera de la caja». Véase también La manera correcta de instalar y configurar JSF de bibliotecas a través de Maven?.


    2. Instalar una verdadera implementación de la iniciativa en Tomcat. Soldadura es uno de los CDI implementaciones. En la Soldadura de la guía de instalación usted puede encontrar instrucciones de cómo integrar en Tomcat. En aras de la exhaustividad y de referencia en el futuro, aquí están los pasos:

      1. Caída de la weld-servlet-shaded.jar en la webapp del /WEB-INF/lib. En caso de que usted está usando Maven, uso este coordinar:

        <dependency>
            <groupId>org.jboss.weld.servlet</groupId>
            <artifactId>weld-servlet-shaded</artifactId>
            <version>3.0.5.Final</version>
        </dependency>
      2. Crear /META-INF/context.xml archivo en webapp con el contenido siguiente:

        <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 usted está utilizando Mojarra 2.2.11 o más reciente, ya que será capaz de encontrar a través de ServletContext cuando se ausente en JNDI.

      3. Crear un vacío /WEB-INF/beans.xml archivo en la webapp.

      Que es (nota: en los mayores de Soldadura Servlet versiones, sería necesario registrar explícitamente la CDI bean administrador de la Soldadura y de escucha en web.xml demasiado, pero eso es innecesario con las versiones actuales).

      En caso de que prefiera OpenWebBeans por encima de la Soldadura como la implementación de la iniciativa, de la cabeza a este blog para detallado de Maven instrucciones de instalación: Cómo instalar CDI en Tomcat?


    No relacionados para el problema concreto, la JSP/Servlet Api de Tomcat 7 ¿no cumplir las Api de Java EE 7, en lugar cumple Java EE 6 (Servlet 3.0 /JSP 2.2). Si desea que el Tomcat equivalente de Java EE 7 (Servlet 3.1 /JSP 2.3), entonces usted debe buscar en Tomcat 8. Véase también Apache Tomcat versión de la matriz de.

    Como ya he dicho, «es mi primer Java EE 7 proyecto». Muchas gracias.
    Eres bienvenido.
    Me cambié a TomEE, pero para inicializar muestra el siguiente error: com.sun.faces.config.ConfigurationException: Factory 'javax.faces.application.ApplicationFactory' was not configured properly. vi el tema no se pudo encontrar la Fábrica: javax.las caras.contexto.FacesContextFactory, pero no ayuda. Cualquier comentario?
    Me cambié a Glassfish 4 y tengo el mismo error inicial (Target Unreachable, identifier 'indexMB' resolved to null). He quitado javaee-api-7.0.jar . Comentarios?
    En cuanto a TomEE, ya haces JSF (MyFaces). Si usted todavía bundle otro JSF impl en su webapp, entonces se obtiene exactamente esta excepción. Acaba de quitar JSF Frascos de su webapp. Como GlassFish 4, no estoy seguro de eso, pero es probable que también es causado por un sucio classpath.

    OriginalEl autor BalusC

  2. 0

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

    OriginalEl autor lucasvc

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea