IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Java EE Discussion :

[JSF] Impossible d'accéder à mon EJB local..


Sujet :

Java EE

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 42
    Par défaut [JSF] Impossible d'accéder à mon EJB local..
    Bonjour à tous,
    J'utilise Netbeans 6.1 + Glassfish v2 + JSF
    Ma question: A part face-config et sun-web.xml créé comme décrit ci-dessous, y a t-il un paramétrage à faire avant d'utiliser un ManagedBean?
    Merci du temps consacré à me répondre.

    ==============
    J'ai fait une page evaluations.jsp ou j'utilise un bean managé evaluationController
    pour afficher les lignes d'une table de BD dans un tableau.

    ce bean est déclaré dans face-config.xml comme suit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
         <managed-bean>
            <managed-bean-name>evaluationController</managed-bean-name>
            <managed-bean-class>com.petrone.controller.EvaluationController</managed-bean-class>
            <managed-bean-scope>session</managed-bean-scope>
        </managed-bean>
    ===================
    Mon fichier sun-web.xml
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE sun-web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Application Server 9.0 Servlet 2.5//EN" "http://www.sun.com/software/appserver/dtds/sun-web-app_2_5-0.dtd">
    <sun-web-app error-url="">
      <context-root>/TEST-war</context-root>
      <ejb-ref>
        <ejb-ref-name>java:comp/env/com.petrone.controller.EvaluationController/evaluationLocal</ejb-ref-name>
        <jndi-name>EvaluationBeanBis</jndi-name>
      </ejb-ref>
      <class-loader delegate="true"/>
      <jsp-config>
        <property name="keepgenerated" value="true">
          <description>Keep a copy of the generated servlet class' java code.</description>
        </property>
      </jsp-config>
    </sun-web-app>
    ====================
    Ma classe Evaluation Controller

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     package com.petrone.controller; 
    public class EvaluationController extends Controller{
        @EJB
        private EvaluationLocal evaluationLocal;
     
        private List<Evaluation> evaluations;
    ===================J'ai le message suivant quand j'essaie d'excuter ma page
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     This web app [C:\TEST\TEST-war\build\web] has no ejb reference by the name of [java:comp/env/com.petrone.controller.EvaluationController/evaluationLocal]
    Cannot resolve reference Unresolved Ejb-Ref com.petrone.controller.EvaluationController/evaluationLocal@jndi: @null@com.petrone.business.evaluation.EvaluationLocal@Session@null
    Exception occured in J2EEC Phasejava.lang.RuntimeException: Cannot resolve reference Unresolved Ejb-Ref com.petrone.controller.EvaluationController/evaluationLocal@jndi: @null@com.petrone.business.evaluation.EvaluationLocal@Session@null
    com.sun.enterprise.deployment.backend.IASDeploymentException: Error loading deployment descriptors for module [TEST-war] -- Cannot resolve reference Unresolved Ejb-Ref com.petrone.controller.EvaluationController/evaluationLocal@jndi: @null@com.petrone.business.evaluation.EvaluationLocal@Session@null
            at com.sun.enterprise.deployment.backend.Deployer.loadDescriptors(Deployer.java:390)
            at com.sun.enterprise.deployment.backend.ModuleDeployer.loadDescriptors(ModuleDeployer.java:423)
            at com.sun.enterprise.deployment.backend.WebModuleDeployer.deploy(WebModuleDeployer.java:157)
            at com.sun.enterprise.deployment.backend.ModuleDeployer.doRequestFinish(ModuleDeployer.java:179)
            at com.sun.enterprise.deployment.phasing.J2EECPhase.runPhase(J2EECPhase.java:191)
            at com.sun.enterprise.deployment.phasing.DeploymentPhase.executePhase(DeploymentPhase.java:108)
            at com.sun.enterprise.deployment.phasing.PEDeploymentService.executePhases(PEDeploymentService.java:919)
            at com.sun.enterprise.deployment.phasing.PEDeploymentService.deploy(PEDeploymentService.java:279)
            at com.sun.enterprise.deployment.phasing.PEDeploymentService.deploy(PEDeploymentService.java:788)
            at com.sun.enterprise.management.deploy.DeployThread.deploy(DeployThread.java:187)
            at com.sun.enterprise.management.deploy.DeployThread.run(DeployThread.java:223)
    Caused by: java.lang.RuntimeException: Cannot resolve reference Unresolved Ejb-Ref com.petrone.controller.EvaluationController/evaluationLocal@jndi: @null@com.petrone.business.evaluation.EvaluationLocal@Session@null
            at com.sun.enterprise.deployment.util.EjbBundleValidator.accept(EjbBundleValidator.java:430)
            at com.sun.enterprise.deployment.WebBundleDescriptor.visit(WebBundleDescriptor.java:1406)
            at com.sun.enterprise.deployment.archivist.WebArchivist.validate(WebArchivist.java:188)
            at com.sun.enterprise.deployment.archivist.ApplicationArchivist.openArchive(ApplicationArchivist.java:790)
            at com.sun.enterprise.deployment.archivist.ApplicationArchivist.openArchive(ApplicationArchivist.java:744)
            at com.sun.enterprise.deployment.backend.Deployer.loadDescriptors(Deployer.java:349)
            ... 10 more
    This web app [C:\TEST\TEST-war\build\web] has no ejb reference by the name of [java:comp/env/com.petrone.controller.EvaluationController/evaluationLocal]
    =========================j'ai utilisé la commande verify sur le projet Web
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    Could not verify successfully.
    java.lang.RuntimeException: Cannot resolve reference Unresolved Ejb-Ref com.petrone.controller.EvaluationController/evaluationLocal@jndi: @null@com.petrone.business.evaluation.EvaluationLocal@Session@null
        at com.sun.enterprise.deployment.util.EjbBundleValidator.accept(EjbBundleValidator.java:430)
        at com.sun.enterprise.deployment.WebBundleDescriptor.visit(WebBundleDescriptor.java:1406)
        at com.sun.enterprise.deployment.archivist.WebArchivist.validate(WebArchivist.java:188)
        at com.sun.enterprise.deployment.archivist.ApplicationArchivist.openArchive(ApplicationArchivist.java:790)
        at com.sun.enterprise.tools.verifier.VerificationHandler.createApplicationDescriptor0(VerificationHandler.java:464)
        at com.sun.enterprise.tools.verifier.VerificationHandler.createApplicationDescriptor(VerificationHandler.java:265)
        at com.sun.enterprise.tools.verifier.VerificationHandler.initStandalone(VerificationHandler.java:216)
        at com.sun.enterprise.tools.verifier.VerificationHandler.<init>(VerificationHandler.java:109)
        at com.sun.enterprise.tools.verifier.Verifier.verify(Verifier.java:140)
        at com.sun.enterprise.tools.verifier.Verifier.main(Verifier.java:114)
    =============
    Lorsque j'enleve l'instruction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    @EJB private EvaluationLocal evaluationLocal;
    de ma classe EvaluationController (le managed bean),
    je n'ai plus de bug.

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    59
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 59
    Par défaut
    En fait, c'est normal. Le fait d'utiliser l'injection de dépendances via @EJB fait que le serveur injecte dans la WebApp le bean dont le nom global JNDI est EvaluationLocal.class.getName()

    Or, tu as configuré ta WebApp pour que le bean en question - répondant au nom global JNDI "EvaluationBeanBis" - soit enregistré dans l'ENC (Environment Naming Context) - qui est local à la WebApp et non global ici donc.

    Donc pour résumer, ton bean est accessible via le nom JNDI global -> EvaluationBeanBis

    Il est de plus accessible dans l'ENC - propre à la WebApp - via -> "java:comp/env/com.petrone.controller.EvaluationController/evaluationLocal"

    Tout d'abord, le nom qui doit être indiqué dans la balise <ejb-ref-name/> devrait être -> "com.petrone.controller.EvaluationController/evaluationLocal"

    Autrement-dit, enlèves "java:comp/env/". En effet, cette chaîne de caractères est automatiquement ajoutée lors d'une recherche JNDI sinon tu te retrouves avec :
    "java:comp/env/java:comp/env/com.petrone.controller.EvaluationController/evaluationLocal"

    Deuxièmement, vérifie bien que dans le jar du bean, le nom enregistré est bien "EvaluationBeanBis".

    Si c'est bien le cas, remplace la balise @EJB par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    @EJB(name="com.petrone.controller.EvaluationController/evaluationLocal")
    private EvaluationLocal evaluationLocal;
    Enfin, dans ton web.xml, tu dois avoir aussi les quelques lignes suivantes pour que la résolution du bean via l'ENC fonctionne à partir des infos du sun-web.xml ->

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
        <ejb-ref>
            <description>Ceci est une description lambda</description>
            <ejb-ref-name>com.petrone.controller.EvaluationController/evaluationLocal</ejb-ref-name>
            <ejb-ref-type>Session</ejb-ref-type>
            <home/>
            <local>[chemin complet avec le package]EvaluationLocal</local>
        </ejb-ref>

    Voilà, cela devrait fonctionner maintenant à condition que ton EJB local soit packagé dans un jar, que ta WebApp soit packagée dans un WAR et que le WAR + le JAR soient packagés dans un EAR, sinon, le bean local ne sera pas accessible.

    Bon courage !

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 42
    Par défaut
    Merci sebastien.hebert pour ta réponse.
    Tes explications m'ont permi de mieux comprendre le principe.
    J'ai suivi tes conseils.
    1-J'ai corrigé la déclaration de l'ejb comme suit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    @EJB(name="com.petrone.controller.EvaluationController/evaluationLocal")
    private EvaluationLocal evaluationLocal;
    2-dans sun-web.xml,j'ai remplacé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    java:comp/env/com.petrone.controller.EvaluationController/evaluationLocal
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    com.petrone.controller.EvaluationController/evaluationLocal
    3-J'ai rajouté dans web.xml les lignes.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
        <ejb-ref>
            <description> </description>
            <ejb-ref-name>com.petrone.controller.EvaluationController/evaluationLocal</ejb-ref-name>
            <ejb-ref-type>Session</ejb-ref-type>
            <home/>
            <local>com.petrone.business.evaluation.EvaluationLocal</local>
        </ejb-ref>
    4-J'ai vérifié que mon Bean EvaluationBean marche correctement.

    5-le module web est effectivement dans un war , le module ejb dans un jar et les 3 (mon client swing en plus) sont dans un ear.
    Ce ear s'exécute correctement lorsque je spécifie que le module client est le client swing.

    Cependant, j'ai toujours la même erreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Deploying application in domain failed; Error loading deployment descriptors for module [TEST-war] -- Cannot resolve reference Unresolved Ejb-Ref com.petrone.controller.EvaluationController/evaluationLocal@jndi: EvaluationBean@null@com.petrone.business.evaluation.EvaluationLocal@Session@null
    Je ne sais vraiment plus quoi faire.

    Ca fait bientot 10 jours que ne peut plus avancer.

    Merci du temps passé à me répondre.

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    59
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 59
    Par défaut
    Pas de panique, je viens de faire un test et ça marche dans Glassfish. Tout d'abord, n'inclut pas dans ton EAR de module client. En effet, si ce dernier a un problème quelque part, alors c'est l'ensemble du déploiement EAR qui échouera donc les EJB et la WebApp.

    Donc, voici ce que j'ai fait, j'ai créé un projet exemple-jar avec l'EJB suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    // Pour l'interface
     
    package exemple.service;
     
    // L'annotation @Local est facultative pour un bean sans état qui est local
    public interface HelloServiceLocal {
        String sayHello(String test);
    }
    La classe d'implémentation est sans surprise :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    // Pour l'implémentation du service métier :
     
    package exemple.service;
     
    import javax.ejb.Stateless;
     
    @Stateless(mappedName="com.petrone.controller.EvaluationController/evaluationLocal")
    public class HelloServiceBean implements HelloServiceLocal {
     
        @Override
        public String sayHello(String test) {
            StringBuilder s = new StringBuilder("Bonjour > ");
            s.append(test);
            return  s.toString();
        }
     
    }
    L'attribut mappedName te sert à enregistrer ton EJB dans le service d'annuaire du serveur d'application. Autrement-dit, il s'agit du "nom JNDI global".

    Dans la webapp, j'ai un bean managé JSF comme le montre mon faces-config.xml :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    <?xml version='1.0' encoding='UTF-8'?>
     
    <faces-config version="1.2" 
        xmlns="http://java.sun.com/xml/ns/javaee" 
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
        xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_1_2.xsd">
     
        <managed-bean>
            <managed-bean-name>Page1</managed-bean-name>
            <managed-bean-class>exemplewar.Page1</managed-bean-class>
            <managed-bean-scope>request</managed-bean-scope>
        </managed-bean>
    </faces-config>
    Dans le code du bean, j'utilise l'instruction suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    public class Page1 {
     
         @EJB(name="MonEJBDansENC")
         private HelloServiceLocal service;
     
         public String button1_action() {
            String entreeUser = (this.textField1.getText() == null ? null : this.textField1.getText().toString());
            this.staticText1.setText(service.sayHello(entreeUser));
            return null;
        }
     
    }

    Ici, l'EJB est référencé sous le nom "MonEJBDansENC", autrement-dit, l'EJB doit être accessible dans l'ENC (Environement Naming Context) de l'application Web sous le nom "MonEJBDansENC".

    Autrement-dit, nous aurions pu écrire la chose suivante pour récupérer notre EJB via JNDI dans l'ENC (c'est moins élégant mais cela permet de comprendre l'injection des EJB) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    public class Page1 {
     
     
         public String button1_action() {
            Context enc = new InitialContext();
            HelloServiceLocal service = (HelloServiceLocal) enc.lookup("java:comp/env/MonEJBDansENC");
     
            String entreeUser = (this.textField1.getText() == null ? null : this.textField1.getText().toString());
            this.staticText1.setText(service.sayHello(entreeUser));
            service = null;
            return null;
        }
     
    }
    OK, donc ma WebApp et mon EJB sont respectivement dans un WAR et un JAR. Puisque mon EJB est "Local", il me faut rendre visible mon EJB par la WebApp. Cela se fait en créant un EAR qui contient le WAR et le JAR.

    Il reste donc à faire la résolution de nom "MonEJBDansENC" <-> "com.petrone.controller.EvaluationController/evaluationLocal".

    Voici ce qu'il faut mettre dans web.xml :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    <ejb-local-ref>
            <ejb-ref-name>MonEJBDansENC</ejb-ref-name>
            <ejb-ref-type>Session</ejb-ref-type>
            <local-home/>
            <local>exemple.service.HelloServiceLocal</local>
    </ejb-local-ref>
    Le problème que tu as rencontré est de ma faute car c'est la balise <ejb-local-ref/> qu'il faut utiliser pour les EJB locaux. On utilisera bien sûr la balise <ejb-ref/> pour des EJB distants (donc avec @Remote).

    Dans sun-web.xml, il faut mettre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     <ejb-ref>
        <ejb-ref-name>MonEJBDansENC</ejb-ref-name>
        <jndi-name>com.petrone.controller.EvaluationController/evaluationLocal</jndi-name>
      </ejb-ref>
    Dans sun-web.xml, c'est par contre bien la balise <ejb-ref/> qu'il faut utiliser.

    Voilà, essaie par cet exemple simple et tiens-moi au courant.

    Dernière chose, le fait de nommer tes Beans dans la balise @Stateless via l'attribut mappedName rend tes EJB moins portables d'un serveur d'application à l'autre. Tu peux éviter de renseigner cet attribut tout en évitant de renseigner les balises <ejb-ref/> de sun-web.xml et <ejb-local-ref/> du web.xml.

    Dans ce cas, le nom JNDI global et le nom JNDI dans l'ENC sera le même et ce sera le nom de l'interface du Bean par défaut -> donc ici :

    "exemple.service.HelloServiceLocal"

    Voilà, bon courage mais je pense que tu vas y arriver.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 42
    Par défaut
    Encore une fois, merci sebastien.hebert pour ton aide. Je n'ai certes pas encore résolu le problème.
    Mais ma compréhension s'est réellement améliorée.

    Désolé de paraitre insistant. Mais malgré la précision des indications, j'ai toujours la même erreur.
    Je me suis dis que peut-etre c'est une mauvaise config de ma part. Ou que je fais une erreur tellement idiote que personne n'y pense.

    J'ai donc recréé un nouveau Projet TEST. Je l'envoie ci-joint. Dans ce projet j'ai essayé de suivre à la lettre tes indications.
    J'ai un bean session HelloServiceBean dans le projet TEST-ejb. J'utilise une référence de ce bean dans le projet TEST-war.

    Si vous pouviez jetez un coup d'oeil pour voir qu'est ce qui cloche dans la configuration ou le code.

    Merci.
    Fichiers attachés Fichiers attachés

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    59
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 59
    Par défaut
    Bonjour,

    Désolé, je n'ai pas encore eu le temps de regarder où se situe exactement le pb. Je pense à priori à un problème qui touche la WebApp en général - et donc le déploiement de cette dernière indépendamment de la configuration des EJB et de leur liaison à la WebApp.

    Je regarde dès que j'ai un moment et reviens vers vous aussi vite que faire se peut.

    Je proposerai dans la réponse notamment des tests unitaires permettant de tester les EJB indépendamment de leur liaison à une WebApp.

    Bonne soirée et à bientôt.

    Séb.

Discussions similaires

  1. Impossible d'accéder à mon site
    Par boutchikine dans le forum IFrance
    Réponses: 3
    Dernier message: 14/02/2010, 22h36
  2. Réponses: 5
    Dernier message: 26/10/2009, 14h33
  3. Impossible d'accéder à MON propre site web
    Par Erakis dans le forum Hébergement
    Réponses: 0
    Dernier message: 09/01/2009, 03h29
  4. Impossible d'accéder à mon site de certains endroits
    Par libuma dans le forum Hébergement
    Réponses: 7
    Dernier message: 31/12/2008, 16h07
  5. DataTemplate : Impossible d'accéder à mon objet
    Par seiryujay dans le forum Windows Presentation Foundation
    Réponses: 2
    Dernier message: 24/10/2008, 11h24

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo