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 :

Injection @EJB dans le Client Web ne fonctionne pas


Sujet :

Java EE

  1. #1
    Membre éclairé Avatar de warwink
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    650
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 650
    Points : 823
    Points
    823
    Par défaut Injection @EJB dans le Client Web ne fonctionne pas
    Yop,

    je craque, je demande à l'aide

    Tout d'abord, je déploie sur GlassFish et j'utilise Toplink et Postgres pour la base. Dans l'ear que je déploie, j'ai deux projet : un projet ejb correspondant au serveur et un projet war correspondant au client web.

    Donc mon problème est au niveau de mon client Web dans lequel je n'arrive pas à faire d'injection dans mes classes de mes session local.

    Un peu de code :

    Une de mes sessions

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    @Local
    public interface CoordinatesSessionLocal {
     
        public List findAll();
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    @Stateless
    public class CoordinatesSessionBean implements CoordinatesSessionLocal, Serializable {
     
        @PersistenceContext
        private EntityManager em;
     
        public List<CoordinatesEntity> findAll() {
            return (List<CoordinatesEntity>)em.createQuery("SELECT o FROM CoordinatesEntity o").getResultList();
        }
    }
    Mon entité :

    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
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    @Entity
    @Table(name = "Coordinates")
    public class CoordinatesEntity implements Serializable {
     
        private static final long serialVersionUID = -9036561041664855342L;
        @Id
        @GeneratedValue(strategy = GenerationType.AUTO)
        private long id;
        private String address;
        private String addressComplement;
        private String postalCode;
        private String city;
        @Column(nullable = false)
        private String phone;
        @Column(nullable = false)
        private String email;
        private String fax;
        @Version
        private int version;
     
        public CoordinatesEntity() {
        }
     
        public CoordinatesEntity(String address, String addressComplement, String postalCode, String city, String phone, String email, String fax) {
            this.address = address;
            this.addressComplement = addressComplement;
            this.postalCode = postalCode;
            this.city = city;
            this.phone = phone;
            this.email = email;
            this.fax = fax;
        }
     
        public String getAddress() {
            return address;
        }
     
     
        public String getAddressComplement() {
            return addressComplement;
        }
     
     
        public String getCity() {
            return city;
        }
     
        public String getEmail() {
            return email;
        }
     
     
        public String getFax() {
            return fax;
        }
     
        public long getId() {
            return id;
        }
     
        public String getPhone() {
            return phone;
        }
     
        public String getPostalCode() {
            return postalCode;
        }
     
     
        public int getVersion() {
            return version;
        }
     
        public void setAddress(String address) {
            this.address = address;
        }
     
     
        public void setAddressComplement(String addressComplement) {
            this.addressComplement = addressComplement;
        }
     
     
        public void setCity(String city) {
            if (city == null || city.isEmpty()) {
                return;
            }
            if (Rules.checkCity(city)) {
                throw new IllegalArgumentException("the format of city isn't valid");
            }
            this.city = city;
     
        }
     
        public void setEmail(String mail) {
            if (mail == null || mail.isEmpty()) {
                throw new IllegalArgumentException("You must specify a mail");
            }
            if (!Rules.checkEmail(mail)) {
                throw new IllegalArgumentException("the mail isn't valid : it must follow the pattern myname@mydomain.fr for example");
            }
            this.email = mail;
     
        }
     
     
        public void setFax(String fax) {
            if (fax == null || fax.isEmpty()) {
                return;
            }
            if (!Rules.checkFax(phone)) {
                throw new IllegalArgumentException("the fax number isn't valid : it must contain ten numbers");
            }
            this.fax = fax;
        }
     
     
        public void setId(long id) {
            this.id = id;
        }
     
        public void setPhone(String phone) {
            if (phone == null || phone.isEmpty()) {
                return;
            }
            if (!Rules.checkPhone(phone)) {
                throw new IllegalArgumentException("the phone number isn't valid : it must contain ten numbers");
            }
            this.phone = phone;
        }
     
     
        public void setPostalCode(String postalCode) {
            if (postalCode == null || postalCode.isEmpty()) {
                return;
            }
            if (!Rules.checkPostalCode(postalCode)) {
                throw new IllegalArgumentException("the postal code isn't valid : it must be composed of five numbers");
            }
            this.postalCode = postalCode;
     
        }
     
        public void setVersion(int version) {
            this.version = version;
        }
     
    }
    Côté Client Web : J'ai créé un servlet et une classe de test

    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
    38
    39
    40
    41
    public class MyServlet extends HttpServlet {
    
        @EJB
        private CoordinatesSessionLocal coordinatesSession;
    
        protected void processRequest(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            response.setContentType("text/html;charset=UTF-8");
            PrintWriter out = response.getWriter();
            try {
    
                List news = coordiantesSession.findAll();
                for (Iterator it = news.iterator(); it.hasNext();) {
                    A elem = (A) it.next();
                    out.println(" <b> name : " + elem.getEmail() + " </b><br />");
                }
    
                List news2 = new NewClass().getCoordiantesSessionLocal().findAll();
                for (Iterator it = news2.iterator(); it.hasNext();) {
                    A elem = (A) it.next();
                    out.println(" <b> name : " + elem.getEmail() + " </b><br />");
                }
                
            } finally {
                out.close();
            }
        }
    
         protected void doGet(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            processRequest(request, response);
        }
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            processRequest(request, response);
        }
    public String getServletInfo() {
            return "Short description";
        }
    
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    public class NewClass {
     
        @EJB
        private CoordinatesSessionLocal coordinatesSession;
        public CoordinatesSessionLocal getCoordinatesSessionLocal () {
            return coordinatesSession;
        }
     
    }

    Donc, j'ai des infos dans ma base pour récupérer des coordonnées, ma méthode findAll marche.

    Maintenant quand on regarde mon servlet, je vais afficher deux fois les coordonnées, une première fois en utilisant l'injection que je fais dans mon servlet et la deuxieme fois en utilisant celle de ma classe newClass.

    La premier affichage marche mais le deuxième me fais un NullPointerException.

    file:/D:/Java/Workspace/Netbeans/HIP/dist/gfdeploy/HIP-ejb_jar/-HIP-ejbPU login successful
    StandardWrapperValve[MyServlet]: PWC1406: Servlet.service() for servlet MyServlet threw exception
    java.lang.NullPointerException
    at web.MyServlet.processRequest(MyServlet.java:46)
    at web.MyServlet.doGet(MyServlet.java:73)
    Pourquoi mon injection marche dans mon servlet et pas dans ma classe ?

  2. #2
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 274
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 274
    Points : 4 141
    Points
    4 141
    Par défaut
    Parce que l'injection ne fonctionne que dans certaines classe: ejb, servlet.

    Dans ce cas là, tu dois passer par un lookup jndi.

  3. #3
    Membre éclairé Avatar de warwink
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    650
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 650
    Points : 823
    Points
    823
    Par défaut
    Dans ce cas, je peux faire qu'un lookup que sur mes interfaces remote. puisque que les local's ne sont pas dans l'annuaire jndi

  4. #4
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 274
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 274
    Points : 4 141
    Points
    4 141
    Par défaut
    Ben normalement, quand tu fais ton lookup, tu choisis si tu le fais en local ou en remote.

  5. #5
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 274
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 274
    Points : 4 141
    Points
    4 141
    Par défaut
    En remote :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Context ctx = new InitialContext();
                PersonneServiceRemote personneService = (PersonneServiceRemote)ctx.lookup("PersonneServiceBean/remote");
    En local:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
                PersonneServiceLocal personneService = (PersonneServiceLocal)ctx.lookup("PersonneServiceBean/local");

  6. #6
    Membre éclairé Avatar de warwink
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    650
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 650
    Points : 823
    Points
    823
    Par défaut
    Moi déjà, ca ne passe pas si je ne met pas de properties dans mon InitialContext du style :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
                Properties props = new Properties();
                props.setProperty("java.naming.factory.initial", "com.sun.enterprise.naming.SerialInitContextFactory");
                props.setProperty("java.naming.factory.url.pkgs", "com.sun.enterprise.naming");
                props.setProperty("java.naming.factory.state", "com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl");
                props.setProperty("org.omg.CORBA.ORBInitialHost", "localhost");
                props.setProperty("org.omg.CORBA.ORBInitialPort", "8080");
                initialContext = new InitialContext(props);
    Ensuite je fais mes lookup comme ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    aSessionRemote = (ASessionRemote) initialContext.lookup(ASessionRemote.class.getName());
    Là avec la remote, ca marche mais si je le fais avec la local car marche pas, et d'un côté c'est normal car quand je regarde dans mon GlassFish l'annuaire JNDI, je ne vois que les session remote.

    Moi, ce que ne ne comprend pas trop, c'est pourquoi l'injection dans un classe alors qu'elle est pourtant bien dans le conteneur Web, ou alors c'est pas comme ca que ca marche

  7. #7
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 274
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 274
    Points : 4 141
    Points
    4 141
    Par défaut
    Pour moi ça fonctionne en local et remote.
    Ton bean implémente-t-il bien les deux interfaces, local et remote ?

    Effectivement, tu devrais voir dans ton jndi les 2 interfaces.

  8. #8
    Membre éclairé Avatar de warwink
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    650
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 650
    Points : 823
    Points
    823
    Par défaut
    Oui, toutes mes entités implémentes les deux interfaces, une locale et une remote.

    Du style :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    @Local
    public interface CoordinatesSessionLocal {
     
        public List findAll();
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    @Remote
    public interface CoordinatesSessionRemote {
     
        public List findAll();
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    @Stateless
    public class CoordinatesSessionBean implements CoordinatesSessionLocal, CoordinatesSessionRemote, Serializable {
     
        @PersistenceContext
        private EntityManager em;
     
        public List<CoordinatesEntity> findAll() {
            return (List<CoordinatesEntity>)em.createQuery("SELECT o FROM CoordinatesEntity o").getResultList();
        }
    }

  9. #9
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 310
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 310
    Points : 9 522
    Points
    9 522
    Billets dans le blog
    1
    Par défaut
    Il faut bien comprendre le fonctionnement :
    La servlet tourne dans un conteneur de servlet et l'ejb... dans un conteneur d'ejb.
    Ca n'a aucun sens de faire new Objet() (conteneur servlet) sur un objet étant sensé tourner dans un conteneur d'ejb...
    Schématiquement, tu as une servlet qui appelle les services d'un ejb, lequel renvoie des données (structurée ou non)...

    Je ne sais pas si je suis très clair mais bon, j'essaye

    A+
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  10. #10
    Membre émérite
    Avatar de alexismp
    Homme Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 503
    Points : 2 777
    Points
    2 777
    Par défaut
    Avec appserv-rt.jar dans le classpath, inutile de spécifier le propriétés JNDI (cf. FAQ)

Discussions similaires

  1. Injection d'EJB dans une appli web lance java.lang.NullPointerException
    Par Sylvain__A_ dans le forum Glassfish et Payara
    Réponses: 1
    Dernier message: 20/06/2011, 23h31
  2. reférencer un projet EJB dans un client web
    Par amonray dans le forum Java EE
    Réponses: 1
    Dernier message: 05/10/2009, 10h05
  3. Pas de scrollbar dans mon client web
    Par kacedda dans le forum Flex
    Réponses: 4
    Dernier message: 04/11/2008, 11h37
  4. [EJB] Comment faire référence à un ejb dans un client distant ?
    Par tofke dans le forum Java EE
    Réponses: 5
    Dernier message: 25/01/2008, 09h44
  5. injection EJB dans un validateur JSF
    Par drim dans le forum Seam
    Réponses: 3
    Dernier message: 09/01/2008, 17h13

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