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 :

[EJB] Session bean non instancié


Sujet :

Java EE

  1. #1
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2008
    Messages
    79
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2008
    Messages : 79
    Par défaut [EJB] Session bean non instancié
    Bonjour,

    J'ai un problème au niveau mon EJB. Quand j'essaye de récupérer une méthode dans mon manager bean, j'ai une exception de type java.lang.NullPointerException au niveau de la ligne qui exécute ma méthode. Voici la source de mon session bean :

    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
     
    @Stateless
    @Local(TestSessionLocal.class)
    public class TestSession implements TestSessionLocal {
     
        public TestSession() {
            System.out.println("Bean instancié !!!");
        }
     
        // Add business logic below. (Right-click in editor and choose
        // "Insert Code > Add Business Method")
     
        public String getString(){
            return "test";
        }
    }
    Son interface :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    @Local
    public interface TestSessionLocal {
     
        public java.lang.String getString();
     
    }
    Et le manager bean qui récupère la méthode :

    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
    25
    26
    27
    28
     
    public class Bean implements Serializable{
     
        private List<Utilisateur> list;
        private int i;
        private String value;
     
        @EJB
        private TestSessionLocal test;
     
        public Bean() {
     
            System.out.println(test.getString());
            list = new ArrayList<Utilisateur>();
            list.add(new Utilisateur("prénom1", "nom1", "adresse1", "age1"));
            list.add(new Utilisateur("prénom2", "nom2", "adresse2", "age2"));
            list.add(new Utilisateur("prénom3", "nom3", "adresse3", "age3"));
            list.add(new Utilisateur("prénom4", "nom4", "adresse4", "age4"));
        }
     
        public List<Utilisateur> getList() {
            return list;
        }
     
        public void setList(List<Utilisateur> list) {
            this.list = list;
        }
    }
    Pour moi il arrive bien à récupère le session bean, puisque je n'ai pas d'erreur de type naming exception.

    J'ajoute que lorsque que je déploie mon application, "Bean instancié !!!" n'est pas affiché dans la console, alors que normalement il devrait l'être, puisque je crois que l'instanciation du bean ce fait au déploiement ?

    Enfin j'ai fait des tests en utilisant session remote, les performances ne sont pas extra, mais ça marche. De plus si ça peut vous être utile comme info, j'utilise weblogic comme serveur d'application.

    Merci d'avance.

  2. #2
    Membre émérite Avatar de Heimdal
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    549
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 549
    Par défaut
    L'injection a lieu après l'instanciation d'un objet managé, autrement dit après le constructeur... Il faut bien le construire pour lui attacher quoi que ce soit

    J'ajoute que lorsque que je déploie mon application, "Bean instancié !!!" n'est pas affiché dans la console, alors que normalement il devrait l'être, puisque je crois que l'instanciation du bean ce fait au déploiement ?
    Aucune garantie la-dessus, les pools d'EJB ne sont pas forcément pré-remplis.

  3. #3
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2008
    Messages
    79
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2008
    Messages : 79
    Par défaut
    Merci pour ces précisions Heimdal, mais comment tu instancie le bean ? Au niveau du manager bean ? Parce que en utilisant les sessions remotes tu n'as pas besoin de l'instancier.

  4. #4
    Membre émérite Avatar de Heimdal
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    549
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 549
    Par défaut
    Il faut plutôt ne pas l'utiliser dans le constructeur...

  5. #5
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2008
    Messages
    79
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2008
    Messages : 79
    Par défaut
    Heu je vois pas ou tu veux en venir.

  6. #6
    Membre émérite Avatar de Heimdal
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    549
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 549
    Par défaut
    Je suppose que ça pète la:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    public Bean() {
     
            System.out.println(test.getString());
            list = new ArrayList<Utilisateur>();
            list.add(new Utilisateur("prénom1", "nom1", "adresse1", "age1"));
            list.add(new Utilisateur("prénom2", "nom2", "adresse2", "age2"));
            list.add(new Utilisateur("prénom3", "nom3", "adresse3", "age3"));
            list.add(new Utilisateur("prénom4", "nom4", "adresse4", "age4"));
        }

    Je te propose juste de virer cette ligne.

  7. #7
    Membre chevronné
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2004
    Messages
    265
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Avril 2004
    Messages : 265
    Par défaut
    Je te propose juste de virer cette ligne.
    C'est un peu dur ça, puisque c'est ça qu'il veut tester.

    Par contre pour rejoindre Heimdal (je ne suis plus précisément comment fonctionne l'injection). L'injection est peut-être faites après l'appel du constructeur (auquel cas test resterait null dans le constructeur) => il faudrait déplacer la ligne en question dans une méthode de ta classe Bean que tu invoquerait après avoir fait le "new Bean()".

  8. #8
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2008
    Messages
    79
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2008
    Messages : 79
    Par défaut
    Ouais je viens tester. J'ai fait un bouton dans ma page jsp qui appel une méthode :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    public void test(){
            System.out.println(test.getString());
    }
    Mais ça me fait la même erreur à cette ligne quand je clique sur le bouton.

    [EDIT] : Par contre j'ai pas vu cette ligne au déploiement de l'appli :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SEVERE: JSF1030: The specified InjectionProvider implementation 'com.bea.faces.WeblogicInjectionProvider' cannot be loaded.
    Mais comme c'est du JSF je pense que ça à rien à voir avec mon problème ?

  9. #9
    Membre émérite Avatar de Heimdal
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    549
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 549
    Par défaut
    J'ai l'impression que Weblo, comme Glassfish, ne publie pas les interfaces locales des EJB stateless dans l'annuaire JNDI... A confirmer.

    Tentes de façon plus archaïque:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    @EJB(name="unNomQqcq", beanInterface=TonEjbLocal.class)
    public class TonManagedBean {
     
    }
    et pour récupérer ton objet, une recherche dans le contexte:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    InitialContext ic = new InitialContext();
     
    TonEjbLocal foo = (TonEjbLocal) ic.lookup("java:comp/env/unNomQqcq");

    Attention, dans JEE5 il n'y a pas de normes sur le nommage jndi.
    Il se peut très bien que ce ne soit pas exactement "java:comp/env/unNomQqcq"

  10. #10
    Membre émérite Avatar de Heimdal
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    549
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 549
    Par défaut
    Arf j'oubliais une question de base...

    C'est bien un ear que tu déploies (avec le war et le jar embarqué)?

  11. #11
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2008
    Messages
    79
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2008
    Messages : 79
    Par défaut
    Oui je déploie bien un .ear.

  12. #12
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2008
    Messages
    79
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2008
    Messages : 79
    Par défaut
    J'ai testé t'as proposition :

    Manager bean :

    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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
     
    public class Bean implements Serializable{
     
        private List<Utilisateur> list;
        private int i;
        private String value;
     
        @EJB(beanInterface=TestSessionLocal.class,mappedName="Test", beanName="test")
        private TestSessionLocal test;
     
        public Bean() {     
            try {
                InitialContext ctx = new InitialContext();
                test = (TestSessionLocal) ctx.lookup("Test#" + TestSessionLocal.class.getName());
    //            System.out.println(test.getString());
                list = new ArrayList<Utilisateur>();
                list.add(new Utilisateur("prénom1", "nom1", "adresse1", "age1"));
                list.add(new Utilisateur("prénom2", "nom2", "adresse2", "age2"));
                list.add(new Utilisateur("prénom3", "nom3", "adresse3", "age3"));
                list.add(new Utilisateur("prénom4", "nom4", "adresse4", "age4"));
            } catch (NamingException ex) {
                Logger.getLogger(Bean.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
     
        public List<Utilisateur> getList() {
            return list;
        }
     
        public void setList(List<Utilisateur> list) {
            this.list = list;
        }
     
        public void test(){
            System.out.println(test.getString());
        }
    }
    Session local :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    @Stateless(name="test", mappedName="Test")
    @Local({TestSessionLocal.class})
    public class TestSession implements TestSessionLocal {
     
        // Add business logic below. (Right-click in editor and choose
        // "Insert Code > Add Business Method")
     
        public String getString(){
            return "test";
        }
    }
    L'interface ne change pas. Alors maintenant il me fait un naming exception. En même temps je ne sais pas quoi mettre dans le lookup, puisque je n'arrive pas à voir mon EJB dans le view tree JNDI de weblogic. J'ai donc mis ce que j'avais mis comme si il était en Remote. Mais ça à pas l'air d'être ça.

  13. #13
    Membre émérite Avatar de Heimdal
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    549
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 549
    Par défaut
    @EJB(beanInterface=TestSessionLocal.class,mappedName="xxxx")
    est à mettre sur la classe (et plus sur l'attribut).

    Voici le thread que j'avais suivi lorsque j'avais été confronté à ce genre de soucis avec Glassfish:
    https://glassfish.dev.java.net/javae...l#POJOLocalEJB

    Après je ne garantis pas que ce soit la solution pour Weblo. Une piste à explorer en tout cas.

  14. #14
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2008
    Messages
    79
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2008
    Messages : 79
    Par défaut
    Heu tu es sûr, le compilateur ne veux pas compiler quand je mets l'annotation sur la classe : annotion type not applicable to this kind of declaration. Sinon j'ai testé avec glassfish ça marche parfaitement, c'est ça qui est rageant !!! En plus tu n'as aucun paramètre à rentrer dans les annotations ! Alors pourquoi ça ne marche pas sur weblogic.

    Session bean :

    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    @Stateless
    public class SessionTest implements SessionTestLocal {
     
        // Add business logic below. (Right-click in editor and choose
        // "Insert Code > Add Business Method")
        public String test(){
            return "test";
        }
    }

    Manager bean :

    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    public class Bean {
     
        @EJB
        SessionTestLocal test;
     
        /** Creates a new instance of Bean */
        public Bean() {
        }
     
        public void test(){
            System.out.println(test.test());
        }
    }

    EDIT : En plus selon ce post c'est faisable vu que j'utilise weblogic 11g.

Discussions similaires

  1. Réponses: 2
    Dernier message: 04/02/2013, 21h40
  2. EJB Session Bean MySQL
    Par hamza.rezgui dans le forum NetBeans
    Réponses: 2
    Dernier message: 23/12/2011, 16h57
  3. ejb session bean classCastException Deserialization
    Par bilou69 dans le forum Java EE
    Réponses: 2
    Dernier message: 09/06/2010, 17h29
  4. Réponses: 4
    Dernier message: 18/05/2010, 16h56
  5. [EJB Stateful] Fonctionnement des EJB Stateful Session Bean
    Par T`lash dans le forum Java EE
    Réponses: 3
    Dernier message: 15/04/2008, 02h10

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