2009-10-24 15 views
7

Aufruf habe ich eine EJB wie folgt definiert:NameNotFoundException wenn ein EJB in Weblogic 10.3

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

Wenn es um Weblogic (WL) im Einsatz ist, erhält sie den Namen MyBean. Ich bin mir nicht sicher, ob das wichtig ist.

Ich versuche, die Bohne mit diesem Code zu nennen:

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

Wer weiß, warum ich die folgende Fehlermeldung erhalten?

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

Hat Ihr Bean mehrere Remote-Business-Schnittstelle? –

+0

Ja, die HelloWorld-Schnittstelle. Entschuldigung für lahme Namen. Ich versuche mich mit EJBs vertraut zu machen. – Sajee

+0

Das ist nur eine, nicht multiple :) Ich habe beide Fälle trotzdem beantwortet. –

Antwort

10

Um ein Remote Interface einer Session Bean mit mehreren Remote-Business-Schnittstellen-Lookup (zB com.acme.FooBusiness1, com.acme.FooBusiness2), müssen Sie einen Namen aus der Kombination des Namens globalen JNDI des ejb Ziel abgeleitet Nachschlag (die mappedName() in @Stateless) und die spezifische Remote-Business-Schnittstelle, die von einem „#“ getrennt:

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

im typischen Fall einer Bohne nur eine Remote-Business-Schnittstelle, diese vollständig qualifizierte Form ist nicht erforderlich.

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

dass der theoretische Teil war: In diesem Fall kann die JNDI Bean Namen direkt verwendet werden. Jetzt die Praxis. In Ihrem Fall, von dem, was ich sehen kann, greifen Sie auf das EJB von Weblogic zu, also würde ich lieber den no-arg InitialContext() Konstruktor verwenden (und eine jndi.properties Konfigurationsdatei für andere Umgebungen verwenden), aber das ist nur eine Randnotiz. Dann sollten Sie com.foo.HelloWorld, das Remote Interface nachschlagen, nicht com.foo.HelloWorldBean, die Umsetzung:

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

Und wenn Ihr Bean nur eine Remote-Business-Schnittstelle hat, sollte diese Arbeit:

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

Pascal: Ich habe versucht, ic.lookup ("HelloWorld # com.foo.HelloWorld") und ich bekomme den gleichen Fehler wie oben. Ich habe versucht ic.lookup ("HelloWorld") und ich bekomme den gleichen Fehler wie oben: javax.naming.NameNotFoundException: Kann 'HelloWorld' nicht auflösen. Gelöst '' [Wurzelausnahme ist javax.naming.NameNotFoundException: Kann 'HelloWorld' nicht auflösen. Gelöst ''; verbleibender Name "HelloWorld" – Sajee

+0

Ich habe das EJB in Weblogic implementiert und es erscheint auf der Seite Bereitstellungen der WL Administration Console als myBean. Wenn ich jedoch den JNDI-Baum betrachte, kann ich myBean oder HelloWorld nirgendwo in diesem Baum finden Hinweis? – Sajee

+0

In @Stateless ist @name() das Annotationsäquivalent von in ejb-jar.xml. Wenn kein @Stateless name() angegeben wird, wird standardmäßig der Name der nicht qualifizierten Bean-Klasse verwendet. Ich weiß nicht woher "myBean" kommt. Dann sollte Ihr EJB definitiv im JNDI-Baum als "HelloWorld" (der von Ihnen angegebene Name) angezeigt werden. Sind Sie sicher, dass die Bereitstellung erfolgreich verlaufen ist und dass Ihr EJB bereitgestellt wurde? –