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

Tomcat et TomEE Java Discussion :

[JBoss] NamingException "Erreur : Le Nom StatsEJBBean n'est pas lié à ce Contexte"


Sujet :

Tomcat et TomEE Java

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    11
    Détails du profil
    Informations personnelles :
    Âge : 62
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 11
    Points : 6
    Points
    6
    Par défaut [JBoss] NamingException "Erreur : Le Nom StatsEJBBean n'est pas lié à ce Contexte"
    Salut.
    J'ai un p'tit souci dans le cadre du développement d'un EJB3 dans un environnement Tomcat 6.0 / JBoss 4.2 / Eclipse WTP 2.0

    Pas de problème pour écrire l'EJB (un sample tout simple).
    Pas de problème non plus pour l'appeller à partir d'un client Java standard.
    Par contre, dès que je veux intégrer l'invocation de cet EJB dans une servlet, j'ai une NamingException "Erreur : Le Nom StatsEJBBean n'est pas lié à ce Contexte"

    Je précise que la déclaration de l'EJB et les paramètres des différents projets sont identiques pour l'application Java standard et pour le projet qui abrite la servlet.
    Pour faire fonctionner Tomcat en même tant que JBoss, j'ai modifié les ports utilisés par celui-ci (8081 au lieu de 8080 pour http et 8008 au lieu de 8009 pour AJP). A part ça, et je vois pas le rapport a priori, je vois pas du tout ce que ça peut-être. J'ai trouvé pas mal de problème à peu près similaires ici où là, mais rien qui me permettte de solutionner mon problème.
    Si quelqu'un a une idée....

    Quelques bouts de code.

    Le jndi.properties
    java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory
    java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces
    java.naming.provider.url=localhost:1099
    Le code client (identique pour l'application Java standard et dans la servlet)
    ...
    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
    try
    		{
    			Context context = new InitialContext();
    			StatsEJB bean = (StatsEJB)context.lookup("StatsEJBBean/remote");
    			resp.getOutputStream().print(bean.getStats());
    		}
    		catch(NamingException e)
    		{
    			System.out.println("Erreur : "+e.getMessage());
    			e.printStackTrace();
    		}
     
    Le code serveur (le bean)
    import javax.ejb.Stateless;
     
    @Stateless
    public class StatsEJBBean implements StatsEJB{
    	public String getStats() {
    		return "EJBStats : Statistiques";
    	}
     
    L'interface
     
    @Remote
    public interface StatsEJB {
    	public String getStats();
     
    }

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    548
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 548
    Points : 635
    Points
    635
    Par défaut
    Comment tu accède à l'EJB? parce ce que si tu fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    InitialContext ctx = new InitialContext();
    A priori Tomcat va chercher dans son registre JNDI interne, et donc pas dans le JBoss qui tourne à coté. Pour ça il faut appeler ce constructeur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    	InitialContext(Hashtable<?,?> environment)
    En lui passant le contenu de ton fichier jndi.properties.

    Sinon JBoss contient déjà un Tomcat, ça te permettrait d'éviter ce genre de problèmes.

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    11
    Détails du profil
    Informations personnelles :
    Âge : 62
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 11
    Points : 6
    Points
    6
    Par défaut Thx
    Je vais essayer en lui passant le contenu de mon jndi. Tu veux dire que par défaut, il va récupérer des paramètres d'accès dans les directories de Tomcat ?
    Quant à utiliser JBoss à la place de tomcat....ouais, toute mon appli tourne déjà sous tomcat. Je voulais juste faire quelques tests sur les EJB3.0 et j'ai pas envie de me lancer dans un changement d'environnement.

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    11
    Détails du profil
    Informations personnelles :
    Âge : 62
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 11
    Points : 6
    Points
    6
    Par défaut Bon
    Après avoir bataillé avec les classpath et autres déploiement de jar, je suis coincé avec une exception de type "javax.naming.CommunicationException"

    Il semble que Tomcat n'arrive pas à communiquer avec le service de naming de JBoss (port 1099) pour une raison que je ne comprends pas.

    Le service est pourtant bien là. J'ai bien ajouté les librairie clientes JBoss (jboss-common-client.jar et jnp-client.jar - avant cela, j'avais droit à des classnotfound...). Donc, là, je ne vois plus.
    Je sais que la première conclusion qui vient à l'esprit c'est que c'est pas la peine de s'emmerder avec Tomcat & JBoss, mais j'aimerais quand même bien comprendre quel obscur petit détail j'ai bien pu oublié...Une librairie quelconque, peut-être ?
    Encore une fois, merci de votre aide.

    Le code modifié :
    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
     
    		 Hashtable<String, String> env = new Hashtable<String, String>();
    		 env.put(Context.INITIAL_CONTEXT_FACTORY,
    		      "org.jnp.interfaces.NamingContextFactory");
    		 env.put(Context.PROVIDER_URL, "localhost:1099");
    		 env.put(Context.URL_PKG_PREFIXES,
    			"org.jboss.naming:org.jnp.interfaces");
     
    		try
    		{
    			Context context = new InitialContext(env);
    			StatsEJB bean = (StatsEJB)context.lookup("StatsEJBBean/remote");
    			resp.getOutputStream().print(bean.getStats());
    		}
    		catch(NamingException e)
    		{
    			System.out.println("Erreur : "+e.getMessage());
    			e.printStackTrace();
    		}
    Voici le détail de l'exception levée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Erreur : null
    javax.naming.CommunicationException [Root exception is java.rmi.ServerException: RemoteException occurred in server thread; nested exception is: 
    	java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is: 
    	java.net.MalformedURLException: no protocol: 6.0/lib/]
    	at org.jnp.interfaces.NamingContext.lookup(NamingContext.java:780)
    ......
    MalformedURL ????

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    548
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 548
    Points : 635
    Points
    635
    Par défaut
    "no protocol" ... il faut mettre java.naming.provider.url=jnp\://localhost\:1099

    Sinon franchement utilise le tomcat de JBoss parce que tu vas avoir plein de problèmes pour rien et en plus des performances nettement moins bonnes.
    Normalement tu n'as qu'à mettre ton .war dans le répertoire deploy de JBoss

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    11
    Détails du profil
    Informations personnelles :
    Âge : 62
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 11
    Points : 6
    Points
    6
    Par défaut Nope
    Ca ne marche pas non plus. En tout cas en utilisant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    ...
     env.put("java.naming.provider.url", "jnp://localhost:1099");
    ...
    (Je ne comprends pas tes séquences d'échappement, à ce propos...)

    Pour le fait d'utiliser Jboss en lieu et place de tomcat, j'ai fait un petit essai et...c'est pas gagné. Je vais donc continuer de tenter d'utiliser les deux ensemble - c'est juste pour me faire une idée de la spécification 3 des EJB, de toute façon. Sinon, je ferais des essais avec EasyBeans.

    Mais j'aimerais bien comprendre, quand même....

  7. #7
    Membre confirmé Avatar de toomsounet
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    481
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 481
    Points : 576
    Points
    576
    Par défaut
    Fais voir ton code côté serveur (bean + l'interface remote).

    D'ailleurs, je vois que tu passes des valeurs en dur pour construire ton context. t'as pas trouvé le moyen de passer par le fichier de config?

  8. #8
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    11
    Détails du profil
    Informations personnelles :
    Âge : 62
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 11
    Points : 6
    Points
    6
    Par défaut
    Voila le code serveur. Mais je ne pense pas que ça vienne de là, puisque l'appel de cette EJB fonctioinne très bien à partir d'une appli Java console.
    Je passe les valeurs du contexte en dur parce que je n'arrivais à rien avec un fichier de config. Quelque soit l'endroit où je plaçait le jndi.properties, c'était l'échec total et j'ai trouvé pas mal d'exemples ici où là qui proposaient de positionner dynamiquement les valeurs d'environnement.
    Je pense que c'est vraiment un problème entre Tomcat et Jboss.

    L'interface
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    package Bmac.EJBs;
     
    import javax.ejb.Remote;
     
    @Remote
    public interface StatsEJB {
    	public String getStats();
     
    }
    Le bean

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    package Bmac.EJBs;
     
    import javax.ejb.Stateless;
     
    @Stateless
    public class StatsEJBBean implements StatsEJB{
    	public String getStats() {
    		return "EJBStats : Statistiques";
    	}
     
    }
    Pour être complet, voici le code client, intégré dans une servlet.
    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
     
    		 Hashtable<String, String> env = new Hashtable<String, String>();
    		 env.put("java.naming.factory.initial",
    		      "org.jnp.interfaces.NamingContextFactory");
    		 env.put("java.naming.provider.url", "jnp://localhost:1099");
    		 env.put("java.naming.factory.url.pkgs",
    			"org.jboss.naming:org.jnp.interfaces");
     
    		// Invocation de l'EJB responsable de la gestion des statistiques
    		try
    		{
    			Context context = new InitialContext(env);
    			StatsEJB bean = (StatsEJB)context.lookup("StatsEJBBean/remote");
    			resp.getOutputStream().print(bean.getStats());
    		}
    		catch(NamingException e)
    		{
    			System.out.println("Erreur : "+e.getMessage());
    			e.printStackTrace();
    		}
    C'est juste un squellette que j'envisage d'enrichir, évidemment, à condition que ça marche....

  9. #9
    Membre confirmé Avatar de toomsounet
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    481
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 481
    Points : 576
    Points
    576
    Par défaut
    Check ici si c'est pas la cause de ton erreur....
    http://blog.lecacheur.com/2005/01/10...asses/#more-22


    java.net.MalformedURLException: no protocol: 6.0/lib/]
    Tu dois avoir Tomcat 6 ou un truc dans le genre dans l'url pour acceder à ton répertoire lib. Il faut peut être que tu supprimes les espaces.

  10. #10
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    11
    Détails du profil
    Informations personnelles :
    Âge : 62
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 11
    Points : 6
    Points
    6
    Par défaut Yes
    Ca y est. Ca fonctionne. En effet, c'était un problème de blanc dans le répertoire d'installation de tomcat.
    Pour résumer, donc, en terme d'installation :
    Config :

    Eclipse WTP 2.0
    Tomcat 6.0.14
    Jboss 4.2.2

    Installation :

    - Installer Tomcat dans un répertoire dépourvu d'espace (genre d:\tomcat)
    - Copier les jars (pris dans le répertoire client de jboss) suivants dans le répertoire lib de tomcat :
    ejb3-persistence.jar
    jbossall-client.jar
    jboss-annotations-ejb3.jar
    jboss-aop-jdk50-client.jar
    jboss-aspect-jdk50-client.jar
    jboss-common-client.jar
    jboss-ejb3-client.jar
    jboss-ejb3x.jar
    jnp-client.jar

    Ils ne sont peut-être pas tous utiles, mais j'ai la flemme de les tester un par un.
    - Ne pas oublier de copier aussi le (ou les) jar contenant les classes serveurs des EJB dans le répertoire lib de tomcat.

    Voila, voila. Je vais enfin pouvoir mettre des trucs dans mes EJB...

    Merci beaucoup pour le coup de main.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Tomcat - Datasource] Le Nom jdbc n'est pas lié à ce Contexte
    Par xfacq dans le forum Tomcat et TomEE
    Réponses: 17
    Dernier message: 31/10/2012, 17h47
  2. Tomcat6 , le nom jdbc n'est pas lié à ce contexte.
    Par astrofiles dans le forum Tomcat et TomEE
    Réponses: 0
    Dernier message: 21/11/2008, 11h31
  3. [Tomcat 5.5.25] Le Nom jdbc n'est pas lié à ce Contexte
    Par FabienN dans le forum Tomcat et TomEE
    Réponses: 13
    Dernier message: 14/11/2008, 10h56
  4. Réponses: 3
    Dernier message: 25/06/2008, 14h01
  5. [Struts][Tomcat] ERREUR : le nom jdbc n'est pas lié à ce contexte.
    Par ultracoxy dans le forum Tomcat et TomEE
    Réponses: 23
    Dernier message: 15/06/2006, 16h54

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