1. #1
    Membre à l'essai
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    novembre 2007
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Transports

    Informations forums :
    Inscription : novembre 2007
    Messages : 13
    Points : 17
    Points
    17

    Par défaut Injecté un ejb provenant jar dans une servlet et/ou un POJO d'un autre war

    Bonjour,

    Je commence ma reconversion dans le mode des systèmes d'information (venant des systèmes industriels).
    Pour cela j'ai choisi comme serveur d'application Tomee 7 Plus, me permettant d'avoir un Tomcat JEE7.
    A ce stade de mon apprentissage je n'arrive pas à Injecté (@EJB) un ejb dans ma servlet et/ou mon module REST.

    Mon ejb packagé dans un Ejb.jar
    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
     
    @Local
    public interface PersonneFacadeLocal
    { ...}
     
    @Remote
    public interface PersonneFacadeRemote
    { ...}
     
    @Stateless(name = "PersonneFacade")
    @TransactionManagement(TransactionManagementType.CONTAINER)
    @TransactionAttribute(TransactionAttributeType.REQUIRED)
    public class PersonneFacade
            implements PersonneFacadeRemote, PersonneFacadeLocal
    { ... }
    La Servlet packagé dans servleAPI.war
    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
     
    @WebServlet("/question")
    public class Question extends HttpServlet{
     
        public static final String VUE = "/WEB-INF/formulaire.jsp";
     
        private static final Logger logger = Logger.getLogger(Question.class);
     
        @EJB
        private PersonneFacadeLocal facadeDao;
     
        public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
            ...
        }
    }
    Le Module REST packagé dans RestAPI.war
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    @Path("/Personnes")
    public class Personne
    {
        private static final Logger logger = Logger.getLogger(Personne.class);
     
        @EJB
        private PersonneFacadeLocal facadeDao;
     
        ...
    }
    Les trois packets ne sont packagés dans un EAR (Techno que j'étudierai plus tard).
    Je les déploie les trois séparémment dans mon serveur Tomee 7 Plus, suivant l'ordre suivant:
    1- Déploiement de Ejb.jar
    2- Déploiement de ServletAPI.war
    3- Déploiement de RestAPI.war

    Mon Problème
    Seul Ejb.jar est déploié. Les autres ne sont pas déployé car ne trouvant l'interface de l'EJB
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Caused by: java.lang.NoClassDefFoundError: Lcom/hsmr/genealogie/ejb/facade/PersonneFacadeLocal;
    En fouillant un peu sur internet, j'ai compris ceci.
    Le module Rest n'est pas managé par le Conteneur ce qui implique que c'est de ma responsabilité d'implémenter l'injection de l'EJB soir avec les technos CDI ou JNDI.
    CDI => module et EJB dans le même contener.
    JNDI => module et EJB ne sont pas dans le même contener.
    Question1: Vu que les *.jar et les *.war sont déployés dans Tomee 7, Sont ils donc le même contener? Donc dans la même JVM?
    Si oui y a t il un fichier *.xml à configurer?


    Le module Servlet est managé par le contener comme l'ejb c'est donc de la responsabilité de Tomee d'injecter mon ejb dans ma Servlet.
    Question2: Pourquoi ne le fait-il pas?

    J'ai vu aussi sur internet qu'il y avait peut des fichiers xml à configurer dans les *.war.
    Dans le web.xml de chaque *.war ajouter les balises <ejb-ref>.
    Mais j'avoue que je me suis vite perdu.
    Question3: Pouvez-vous me confirmer que la solution passe bien par la configuration du fichier web.xml ?


    En vous remerciant

  2. #2
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    avril 2007
    Messages
    25 211
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : avril 2007
    Messages : 25 211
    Points : 48 227
    Points
    48 227

    Par défaut

    je ne suis pas expert en configuration tomee, mais voilà pour les concepts


    Vu que les *.jar et les *.war sont déployés dans Tomee 7, Sont ils donc le même contener? Donc dans la même JVM?
    Si oui y a t il un fichier *.xml à configurer?
    Dans le même conteneur, oui
    dans le même VM, oui

    pas contre, il faut être conscient que le conteneur est supposé isoler toutes les applications que tu déploie. Le War ne voit pas les classes du jar et vice versa. En pratique ils sont surement dans des classloaders séparés

    Le module Servlet est managé par le contener comme l'ejb c'est donc de la responsabilité de Tomee d'injecter mon ejb dans ma Servlet.
    Question2: Pourquoi ne le fait-il pas?
    Il doit effectivement injecter un EJB dans un Servlet. Pourvu que l'ensemble fasse partie d'un même déploiement. Hors là tu a 3 déploiements. (2 wars et un jar). Alors il doit y avoir moyen de déployer des ejb globalement sur tomee mais je ne les connais pas. Pour commencer tu peux mettre tout ton code dans le même war et l'injection devrait marcher sans soucis.

    A noter que le standard J2EE oblige à avoir 3 archives minimum: un ear contenant un ejbjar et un war. mais tomee propose des moyens plus simples pour les petites apps

    http://tomee.apache.org/deploying-in-tomee.html
    David Delbecq Java developer chez HMS Industrial Networks AB.     LinkedIn | Google+

  3. #3
    Membre habitué

    Homme Profil pro
    Développeur JavaEE/BigData
    Inscrit en
    mars 2013
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur JavaEE/BigData
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : mars 2013
    Messages : 14
    Points : 168
    Points
    168

    Par défaut

    Salut,

    l'ear est un niveau optionnel depuis quelques années (et non mainstream depuis au moins JavaEE 6), par contre les injections sont par application (donc war). Tu as plusieurs options:

    1. inclure ton ejb.jar dans ton WEB-INF/lib (ajoute le en dépendance de ton(tes) module(s) war)
    2. utilise la fonctionnalité d'injection "remote" de tomee avec un mappedName spécifique à TomEE (http://tomee.apache.org/ejb-refs.html). Cette solution requiert quand même d'avoir l'API "@Remote" des EJB pour fonctionner

    Je te conseillerais "1" tant que tu n'as pas besoin de partager un état local entre les webapps.

Discussions similaires

  1. [applet]utilser des infos pour les traiter dans une servlet
    Par jeromejanson dans le forum Applets
    Réponses: 5
    Dernier message: 08/03/2010, 00h22
  2. Réponses: 2
    Dernier message: 11/03/2007, 02h26
  3. [webservices] heberger un webservices dans une servlet ?
    Par n!co dans le forum Web Services
    Réponses: 14
    Dernier message: 07/12/2005, 15h44
  4. [Session]Récupération d'une session dans une servlet
    Par frizby dans le forum Servlets/JSP
    Réponses: 7
    Dernier message: 18/11/2005, 18h02

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