Comment installer et utiliser CDI sur Tomcat?

je crée mon premier projet Java EE 7, mais j'ai des problèmes. Reconnaissant de toute aide.

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

lorsque L'application démarre, le journal Tomcat affiche le message suivant:

"validateJarFile (C:...buildwebWEB-INFlibjavaee-api-7.0.jar)-jar not loaded. See Servlet 2.3 Spec, section 9.7.2. Offending class: javax/servlet/Servlet .class"

quand je clique sur le bouton qui appelle le haricot géré, je reçois le 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
}

de l'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é:

  • Java EE 6 @javax.annotation.ManagedBean vs. @ javax.injecter.Nommé vs @javax.face.Caraïbes "1519420920
  • identificateur cible inaccessible résolu à nul
  • cible inaccessible, identificateur résolu à nul
  • javax.El.PropertyNotFoundException: cible inaccessible, identifiant' login 'résolu à NULL Spring + JSF
  • http://www.andrejkoelewijn.com/blog/2010/03/05/jee-cdi-tip-target-unreachable-identifier-resolved-to-null /
27
demandé sur Community 2013-09-25 07:58:00

2 réponses

Tomcat comme étant un barebones JSP/Servlet container ne prend pas en charge CDI sorti de la boîte. Exactement comment avez-vous installé CDI? Avez-vous vraiment laissé tomber javaee-api.jar dans /WEB-INF/lib juste pour obtenir votre code à compiler? Oh s'il vous plaît non, ce n'est pas le bon chemin. Le Java EE API JAR contient uniquement les classes API, pas l'implémentation concrète. Se débarrasser de tout le POT. Il peut causer beaucoup d'autres problèmes de portabilité comme ceux décrits dans cette réponse: Comment puis-je importer le javax.L'API servlet dans mon projet Eclipse? vous devriez en fait installer l'implémentation concrète avec L'API spécifique.

vous avez 2 options:

  1. Drop Tomcat et aller pour un vrai Java EE conteneur. Comme vous utilisez Tomcat, il suffit de passer à TomEE . Il est très simple, télécharger le TomEE profil web fichier zip , l'extraire et de l'intégrer dans Éclipse exactement comme tu l'as fait pour Tomcat. N'oubliez pas de supprimer le fichier Java EE JAR de webapp et de modifier la propriété Targeted Runtime dans les propriétés du projet de Tomcat à TomEE afin que les dépendances Java EE soient correctement résolues.

    aucune configuration ou bocal supplémentaire n'est nécessaire. Vous pouvez même supprimer les jarres JSF de votre webapp. TomEE comme étant un véritable conteneur Java EE fournit déjà entre autres JSF et CDI sur la boîte. Si vous utilisez Maven, la coordonnée ci-dessous est suffisante.

    <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"l'exécution cible fournit déjà cette boîte". Voir aussi comment installer et configurer correctement les bibliothèques JSF via Maven? .


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

    1. Drop weld-servlet-shaded.jar webapp /WEB-INF/lib . Dans le cas où 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 sera en mesure de le trouver via ServletContext en cas d'absence dans JNDI.

    3. créer un fichier vide /WEB-INF/beans.xml dans webapp.

    That's it (note: dans les anciennes versions de Servlet de soudure, vous auriez besoin de enregistrer explicitement le gestionnaire de fèves CDI et l'auditeur de soudure dans web.xml aussi, mais c'est inutile avec les versions actuelles).

    dans le cas où vous préférez Openwebeans ci-dessus Weld que la mise en œuvre du CDI, dirigez-vous vers ce blog pour des instructions d'installation Maven détaillées: comment installer le CDI dans Tomcat?


sans rapport au problème concret, le Les API JSP / Servlet de Tomcat 7 do et non sont conformes aux API de Java EE 7, mais à 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 Apache Tomcat version matrix .

56
répondu BalusC 2018-08-31 11:15:07

une autre option possible est de laisser beans.xml dans votre déploiement.

0
répondu lucasvc 2014-06-03 12:27:50