2009-10-24 15 views
7

Mam EJB zdefiniowany jako to:NameNotFoundException podczas wywoływania EJB w Weblogic 10.3

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

Kiedy jest wdrożony do Weblogic (WL), to dostaje nazwę MyBean. Nie jestem pewien, czy to jest ważne.

próbuję wywołać Bean z tym kodem:

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

ktoś wie, dlaczego pojawia się następujący błąd?

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

Czy Twój fasola mieć wiele Remote Business Interface? –

+0

Tak, interfejs HelloWorld. Przepraszam za lame imiona. Próbuję zapoznać się z EJB. – Sajee

+0

To tylko jeden, nie wiele :) W każdym razie odpowiedziałem na oba przypadki. –

Odpowiedz

10

do wyszukiwania zdalnego interfejsu fasoli sesja z wieloma interfejsami zdalnego biznesowy (np com.acme.FooBusiness1, com.acme.FooBusiness2), trzeba do wyszukiwania nazwa pochodzi z połączenia globalnej nazwy JNDI docelowego EJB (the mappedName() w @Stateless) oraz specyficzny Zdalny interfejs biznesowy, oddzielone przez „#”:

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

W typowym przypadku fasoli tylko posiadającego jeden zdalny interfejs biznesowy, to w pełni kwalifikowana forma nie jest potrzebne. W takim przypadku, fasoli Nazwa JNDI można stosować bezpośrednio:

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

To była część teoretyczna. Teraz praktyka. W twoim przypadku, z tego co widzę, masz dostęp do EJB z Weblogic więc wolałbym nie używać-Arg InitialContext() konstruktora (i użyć pliku jndi.properties konfiguracji dla innych środowisk), ale to tylko na marginesie. Następnie należy przyjrzeć się com.foo.HelloWorld, zdalny interfejs użytkownika, a nie com.foo.HelloWorldBean, realizacja:

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

A jeśli fasola ma tylko jeden zdalny interfejs biznesowy, to powinno działać:

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

Pascal. Próbowałem ic.lookup ("HelloWorld # com.foo.HelloWorld") i uzyskać ten sam błąd jak wyżej Próbowałem ic.lookup ("HelloWorld") i pojawia się ten sam błąd, co powyżej: javax.naming.NameNotFoundException: Nie można rozpoznać "HelloWorld" .Rozpoznany '' [Wyjątkiem głównym jest javax.naming.NameNotFoundException: Nie można rozpoznać "HelloWorld" .Zostało rozwiązane '']; „HelloWorld” – Sajee

+0

i wdrożony EJB do Weblogic i wydaje się, MyBean na stronie wdrożeniach w konsoli WL administracyjnym. Jednak kiedy patrzę na drzewie JNDI, nie mogę znaleźć MyBean lub helloworld nigdzie w tym drzewie. Być może, że to Wskazówka? – Sajee

+0

W @Stateless, @name() to odpowiednik adnotacji w pliku ejb-jar.xml. Jeśli nie zostanie określona żadna @Stateless name(), domyślną nazwą będzie niekwalifikowana nazwa klasy komponentu bean. Więc nie wiem skąd pochodzi "myBean". Następnie tak, twoje EJB powinno zdecydowanie być widoczne w drzewie JNDI jako "HelloWorld" (podana nazwa). Czy jesteś pewien, że wdrożenie poszło dobrze i że Twoje EJB jest wdrożone? –