web-dev-qa-db-fra.com

Comment installer et utiliser CDI sur Tomcat?

Je crée mon premier projet Java EE 7, mais j'ai des problèmes. Appréciez toute aide.

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

Au démarrage de l'application, le journal Tomcat affiche le message suivant:

"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"

lorsque je clique sur le bouton qui appelle le bean géré, j'obtiens l'erreur:

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>

Ces sujets ne m'ont pas aidé:

27
Rogério Arantes

Tomcat comme étant un conteneur JSP/Servlet barebones ne prend pas en charge CDI. Comment avez-vous installé CDI exactement? Avez-vous vraiment abandonné javaee-api.jar dans /WEB-INF/lib juste pour obtenir votre code à compiler? Oh s'il te plait non, ce n'est pas la bonne façon. Le Java EE JAR API contient uniquement les classes API, pas l'implémentation concrète. Débarrassez-vous de tout le JAR. Il peut causer de nombreux autres problèmes de portabilité comme ceux décrits dans cette réponse: - Comment importer l'API javax.servlet dans mon projet Eclipse? Vous devez en fait installer l'implémentation concrète avec l'API spécifique.

Vous avez 2 options:

  1. Déposez Tomcat et optez pour un vrai Java conteneur EE. Lorsque vous utilisez Tomcat, passez simplement à TomEE . C'est vraiment simple, téléchargez le Fichier Zip du profil Web TomEE , extrayez-le et intégrez-le dans Eclipse exactement de la même manière que pour Tomcat. N'oubliez pas de supprimer le fichier JAR Java EE JAR de webapp et de le modifier la propriété Targeted Runtime dans les propriétés du projet de Tomcat à TomEE afin que Java EE soient correctement résolues.

    Aucun JAR ou configuration supplémentaire n'est nécessaire. Vous pouvez même supprimer les fichiers JAR JSF de votre application Web. TomEE comme étant un vrai Java EE fournit déjà entre autres JSF et CDI. Dans le cas où vous utilisez Maven, les coordonnées ci-dessous sont suffisantes.

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

    Notez l'importance de provided et sa signification comme dans "le runtime cible le fournit déjà". Voir aussi Comment installer et configurer correctement les bibliothèques JSF via Maven? .


  2. Installez une véritable implémentation CDI sur Tomcat. Weld est l'une des implémentations CDI disponibles. Dans le guide d'installation de Weld vous pouvez trouver des instructions pour l'intégrer dans Tomcat. Par souci d'exhaustivité et de référence future, voici les étapes:

    1. Jeter le weld-servlet-shaded.jar dans la webapp /WEB-INF/lib. Si vous utilisez Maven, utilisez cette coordonnée :

      <dependency>
          <groupId>org.jboss.weld.servlet</groupId>
          <artifactId>weld-servlet-shaded</artifactId>
          <version>3.0.5.Final</version>
      </dependency>
      
    2. Créer /META-INF/context.xml fichier dans webapp avec le contenu suivant:

      <Context>
          <Resource name="BeanManager" 
              auth="Container"
              type="javax.enterprise.inject.spi.BeanManager"
              factory="org.jboss.weld.resources.ManagerObjectFactory"/>
      </Context>
      

      Notez que cette étape n'est pas strictement nécessaire lorsque vous utilisez Mojarra 2.2.11 ou plus récent car il pourra le trouver via ServletContext lorsqu'il est absent dans JNDI.

    3. Créez un /WEB-INF/beans.xml fichier dans webapp.

    C'est tout (remarque: dans les anciennes versions de Weld Servlet, vous devez enregistrer explicitement le gestionnaire de bean CDI et l'écouteur Weld dans web.xml aussi, mais ce n'est pas nécessaire avec les versions actuelles).

    Si vous préférez OpenWebBeans au-dessus de Weld en tant qu'implémentation CDI, rendez-vous sur ce blog pour obtenir des instructions d'installation détaillées de Maven: Comment installer CDI dans Tomcat?


Sans rapport avec le problème concret, les API JSP/Servlet de Tomcat 7 ne pas conformez ces APIs de Java EE 7, au lieu de cela il est conforme Java EE 6 (Servlet 3.0/JSP 2.2). Si vous voulez l'équivalent Tomcat de = Java EE 7 (Servlet 3.1/JSP 2.3), alors vous devriez regarder Tomcat 8. Voir aussi Matrice de version Apache Tomcat .

62
BalusC

Une autre option possible consiste à laisser beans.xml dans votre déploiement.

0
lucasvc