7

J'ai un EJB défini comme ceci:NameNotFoundException lorsque vous appelez un EJB dans Weblogic 10.3

package com.foo; 
@Stateless (mappedName="HelloWorld") 
public class HelloWorldBean implements HelloWorld, HelloWorldLocal 
.... 

Quand il est déployé à Weblogic (WL), il obtient le nom monBean. Je ne suis pas sûr que ce soit important.

J'essaie d'appeler le haricot avec ce code:

Hashtable ht = new Hashtable(); 
ht.put(Context.INITIAL_CONTEXT_FACTORY,"weblogic.jndi.WLInitialContextFactory"); 
ht.put(Context.PROVIDER_URL, "t3://localhost:7001"); 
ic = new InitialContext(ht); 
tp = (HelloWorld) ic.lookup("HelloWorld#com.foo.HelloWorldBean"); 

Quelqu'un sait pourquoi je reçois l'erreur suivante?

javax.naming.NameNotFoundException: While trying to lookup 'HelloWorld#com.foo.HelloWorldBean' didn't find subcontext 'HelloWorld#com'. 
Resolved '' [Root exception is javax.naming.NameNotFoundException: While trying 
to lookup 'HelloWorld#com.foo.HelloWorldBean' didn't find 
subcontext 'HelloWorld#com'. Resolved '']; remaining name 'HelloWorld#com/foo/HelloWorldBean' 
+1

Votre haricot ont Interface de gestion à distance multiple? –

+0

Oui, l'interface HelloWorld. Désolé pour les noms boiteux. J'essaie de me familiariser avec les EJB. – Sajee

+0

C'est seulement un, pas multiple :) J'ai répondu aux deux cas de toute façon. –

Répondre

10

pour rechercher une interface distante d'une session Bean avec plusieurs interfaces d'affaires à distance (par exemple com.acme.FooBusiness1, com.acme.FooBusiness2), vous devez rechercher un nom dérivé de la combinaison du nom JNDI global de la cible ejb (le mappedName() dans @Stateless) et l'interface d'entreprise à distance spécifique, séparés par un « # »:

InitialContext ic = new InitialContext(); 
FooBusiness1 bean1 = (FooBusiness1) ic.lookup("FooEJB#com.acme.FooBusiness1"); 
FooBusiness2 bean2 = (FooBusiness2) ic.lookup("FooEJB#com.acme.FooBusiness2"); 

Dans le cas typique d'un haricot ayant seulement une interface d'entreprise à distance, cette forme entièrement qualifié n'est pas nécessaire. Dans ce cas, le nom JNDI du bean peut être utilisé directement:

FooBusiness bean = (FooBusiness) ic.lookup("FooEJB"); 

Ce fut la partie théorique. Maintenant, la pratique. Dans votre cas, d'après ce que je peux voir, vous accédez à l'EJB depuis Weblogic, donc je préfère utiliser le constructeur InitialContext() sans-arg (et utiliser un fichier de configuration jndi.properties pour les autres environnements) mais ce n'est qu'une petite remarque. Ensuite, vous devriez regarder com.foo.HelloWorld, l'interface à distance, non com.foo.HelloWorldBean, la mise en œuvre:

InitialContext ic = new InitialContext(); 
(HelloWorld) ic.lookup("HelloWorld#com.foo.HelloWorld"); 

Et si votre bean ne possède qu'une seule interface d'entreprise à distance, cela devrait fonctionner:

(HelloWorld) ic.lookup("HelloWorld"); 
+0

Pascal: J'ai essayé ic.lookup ("HelloWorld # com.foo.HelloWorld") et j'ai eu la même erreur que ci-dessus J'ai essayé ic.lookup ("HelloWorld") et je reçois la même erreur que ci-dessus: javax.naming.NameNotFoundException: Impossible de résoudre 'HelloWorld'. Résolu '' [L'exception racine est javax.naming.NameNotFoundException: Impossible de résoudre 'HelloWorld'. Résolu '']; 'HelloWorld' – Sajee

+0

J'ai déployé l'EJB sur Weblogic et il apparaît sous la forme myBean dans la page Déploiements de la console d'administration de WL.Mais quand je regarde l'arborescence JNDI, je ne trouve nulle part myBean ou HelloWorld dans cet arbre. indice? – Sajee

+0

Dans @Stateless, @name() est l'équivalent en annotation de dans ejb-jar.xml. Si aucun nom @Stateless() n'est spécifié, le nom de classe de bean non qualifié est utilisé par défaut. Donc, je ne sais pas d'où vient "myBean". Alors, oui, votre EJB devrait certainement être visible dans l'arbre JNDI comme "HelloWorld" (le nom que vous avez spécifié). Etes-vous sûr que le déploiement s'est bien passé et que votre EJB est déployé? –

Questions connexes