Question

J'ai un EJB défini comme suit:

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

Lorsqu'il est déployé sur Weblogic (WL), il porte le nom myBean. 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 j'obtiens 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'
Était-ce utile?

La solution

Pour rechercher une interface distante d'un session Bean avec plusieurs interfaces distantes (par exemple, com.acme.FooBusiness1 , com.acme.FooBusiness2 ), vous devez effectuer une recherche. un nom dérivé de la combinaison du nom JNDI global de l'ejb cible ( mappedName () dans @Stateless ) et du Remote Business Interface 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 bean n'ayant qu'une seule interface de gestion à distance, ce formulaire 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");

C'était 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, je préfère donc utiliser le constructeur no-arg InitialContext () (et utiliser un jndi.properties fichier de configuration pour les autres environnements) mais il ne s'agit que d'une note de côté. Ensuite, vous devriez rechercher com.foo.HelloWorld , l'interface distante, et non com.foo.HelloWorldBean , la mise en oeuvre:

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

Et si votre bean n'a qu'une seule interface de gestion à distance, cela devrait fonctionner:

(HelloWorld) ic.lookup("HelloWorld");
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top