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

  1. #1
    Membre du Club
    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
    Points : 40
    Points
    40
    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 régulier
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    59
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 59
    Points : 70
    Points
    70
    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 du Club
    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
    Points : 40
    Points
    40
    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 régulier
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    59
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 59
    Points : 70
    Points
    70
    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 du Club
    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
    Points : 40
    Points
    40
    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 régulier
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    59
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 59
    Points : 70
    Points
    70
    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.

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    59
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 59
    Points : 70
    Points
    70
    Par défaut
    Salut,

    Désolé de ne te répondre que maintenant mais j'ai passé deux petites heures à essayer de corriger ton pb. Je crois que cela en valait la peine car cela m'a permis de rectifier deux ou trois petites choses que je pensais acquises et évidentes, ce qui n'était pas le cas.

    Tu trouveras donc l'archive TEST_corrige.rar qui contient la version "corrigée" de ton projet. Les pbs étaient multiples :

    1. Lorsqu'un EJB (donc annoté avec @Stateless) utilise l'attribut mappedName comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    @Stateless(mappedName="MonEJBDansJNDI")
    public class HelloServiceBean implements HelloServiceLocal {
    ...
    }
    , ce dernier est enregistré dans le "service d'annuaire JNDI global" du serveur d'application. Si l'interface métier est distante - @Remote -, l'EJB devient alors localisable à distance par son nom mappé soit "MonEJBDansJNDI" dans notre exemple au lieu de MonInterfaceMetier.class.getName(). Mais si l'interface métier est locale, il semblerait - conditionnel - que l'EJB n'est pas référencé dans le contexte JNDI global. En effet, un EJB Local n'est dispo qu'au sein de la même archive JAR ou EAR. Donc si tu veux injecter un EJB Local dans un bean managé JSF, voici ce qu'il faut taper :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    public class HelloManagedBean {
     
         // On n'utilise pas l''URL MonEJBDansENC
         @EJB
         private HelloServiceLocal serviceLocal;
     
         (...)
    }
    Si tu veux injecter un EJB Remote donc accessible à distance :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    public class HelloManagedBean {
     
         // On utilise l'URL MonEJBDansENC dont la résolution
         // est effectuée vers MonEJBDansJNDI via sun-web.xml
         @EJB(name="MonEJBDansENC")
         private HelloServiceRemoteLocal serviceRemote;
     
         (...)
    }
    Il faut dans ce dernier cas, paramétrer le fichier sun-web.xml comme suit :

    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
     
    <?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>MonEJBDansENC</ejb-ref-name>
        <jndi-name>MonEJBDansJNDI</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>
    En revanche, le paramétrage dans web.xml des balises <ejb-ref/> est complètement facultatif dans Glassfish

    Donc pour résumer, le fichier sun-web.xml permet de référencer dans l'ENC de l'application Web (Environement Naming Context) les EJB distants utilisés, ces derniers étant eux-mêmes références dans le service d'annuaire global JNDI du serveur d'application.

    2. Ton web.xml pointait vers une URL non dispo pour les pages par défaut -->

    Avant ->
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    <welcome-file-list>
            <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>
    Maintenant ->
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    <welcome-file-list>
            <welcome-file>faces/index.jsp</welcome-file>
    </welcome-file-list>
    Cela avait pour effet de générer une erreur 500 pour cause de contexte JSF "FacesContext" non trouvé. En effet, la servlet est mappée sur /faces/*


    3. Le code de ton contrôleur est erroné. Le constructeur ne peut initialiser la variable message puisque l'injection du Bean (l'EJB) n'a lieu qu'après l'initialisation du bean managé JSF par le constructeur par défaut.

    J'ai donc corrigé l'appli en rajoutant une interface @Remote dans l'EJB en plus de l'interface @Locale. Cela m'a permire d'écrire un test unitaire pour tester mon bean distant. La page welcomeJSF a quelque peu été modifiée pour montrer dans la page welcomeJSF comment appeler respectivement le bean par son interface Locale et par son interface distante.

    Dernière chose, j'ai mis une archive sydisnet.rar qui implèmente plus ou moins le même exemple mais avec le design pattern BusisessDelegate et en séparant les interfaces métiers de leur implémentation :

    - sydisnet-commons : Archive JAR référencée par sydisnet-core et sydisnet-war contenant les interfaces métiers.
    - sydisnet-core : Archive JAR contenant l'implémentation des EJB
    - sydisnet-war : Application Web utilisant le design pattern BusinessDelegate et utilisant les services métiers distants (le modèle dans le framework MVC).

    J'espère que tu t'nsortiras.

    Attention en ouvrant les projets dans Netbeans 6.1, il te faudra régler les dépendances de packages non trouvées ainsi que faire un build and clean pour reconstruire correctement les archives et ainsi réussir leur déploiement.

    Pour finir, ton erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ment 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
    était causée par le fait que tu aies déployé l'archive WAR. Il faut déployer l'archive EAR et non pas les archives JAR ou WAR à partir du moment où tu utilises des EJB locaux sinon, ils ne sont pas accessibles.

    Bon courage et tiens-moi au courant !

  8. #8
    Nouveau membre du Club
    Inscrit en
    Juin 2008
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 46
    Points : 31
    Points
    31
    Par défaut
    Bonjour,

    il m'arrive exactement le même problème dans mon projet!!! J'ai repris les explications ci-dessus. J'ai testé le projet de sebastien hebert et ca marche mais pas sur mon projet...Et pourtant je procèdes de la même façon!! J'ai ce type d'erreurs:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    java.lang.RuntimeException: Cannot resolve reference Unresolved Ejb-Ref com.petrone.test.controller.HelloManagedBean/serviceLocal@jndi: @null@com.petrone.test.service.HelloServiceLocal@Session@null
    J'ai beau chercher pourquoi ça marche pas mais je trouve pas de réponses!!!!
    Je lance un SOS, je suis complètement bloquée!!!

    Merci de m'apporter un petit coup de main!

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    59
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

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

    Je voulais savoir si vous en étiez sortie ?

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