Domanda

Ho un bean definito come questo:

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

Quando viene distribuito su Weblogic (WL), ottiene il nome myBean. Non sono sicuro che sia importante.

Provo a chiamare il bean con questo codice:

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");

Qualcuno sa perché ricevo il seguente errore?

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'
È stato utile?

Soluzione

Per cercare un'interfaccia remota di un bean di sessione con più interfacce Remote Business (ad es. com.acme.FooBusiness1 , com.acme.FooBusiness2 ), devi cercare un nome derivato dalla combinazione del nome JNDI globale dell'ejb di destinazione (il mappedName () in @Stateless ) e la specifica Remote Business Interface, separati da un " # " ;

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

Nel caso tipico di un bean con una sola interfaccia di business remota, questo modulo completo non è necessario. In tal caso, il nome JNDI del bean può essere utilizzato direttamente:

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

Questa era la parte teorica. Adesso la pratica. Nel tuo caso, da quello che posso vedere, stai accedendo al bean da Weblogic, quindi preferirei usare il costruttore no-arg InitialContext () (e usare un jndi.properties file di configurazione per altri ambienti) ma questa è solo una nota a margine. Quindi, dovresti cercare com.foo.HelloWorld , l'interfaccia remota, non com.foo.HelloWorldBean , l'implementazione:

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

E se il tuo bean ha solo una Business Interface remota, dovrebbe funzionare:

(HelloWorld) ic.lookup("HelloWorld");
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top