2013-04-11 9 views
12

Mam następujący ...WebSphere: kontekst JNDI Lookup Awaria

Context aContext = = new InitialContext(settings); 
aContext.lookup("java:comp/env/DB2_DB"); 

próbował także ...

aContext.lookup("DB2_DB"); 

web.xml

<resource-ref> 
    <description> 
    </description> 
    <res-ref-name>DB2_DB</res-ref-name> 
    <res-type>javax.sql.DataSource</res-type> 
    <res-auth>Application</res-auth> 
    <res-sharing-scope>Shareable</res-sharing-scope> 
    <mapped-name>DB2_DB</mapped-name> 
</resource-ref> 

następnie w moim ibm- web-bnd.xml ...

<resource-ref name="DB2_DB" binding-name="jdbc/DB2DB" /> 

WebSphere widzę nazwę wiązania zasobów> JDBC> Źródła danych

Ale gdy uruchomię mojej aplikacji Rozumiem ...

spowodowane: javax.naming.NameNotFoundException: Kontekst: Node04Cell/węzły/Node04/servers/server1, name: DB2_DB: Nie znaleziono pierwszego komponentu o nazwie DB2_DB. [Wyjątek głównej jest org.omg.CosNaming.NamingContextPackage.NotFound: IDL: omg.org/CosNaming/NamingContext/NotFound: 1,0]^M

Ten projekt dla portu WAS6-8.5

+0

Domyślam się, że jest to wyjątek dla wyszukiwania "DB2_DB". Jaki jest wyjątek dla wyszukiwania "java: comp/env/DB2_DB"? –

+1

Podszedłeś do tego? Po prostu miałem podobny problem i dla mnie był to zwykły błąd literowy. –

+0

Zapomniałem, co zrobiłem (jeśli zrobiłem), aby rozwiązać ten – Jackie

Odpowiedz

13

Cóż, to pytanie jest dość stare i widzę, że nie ma jeszcze akceptowanej odpowiedzi, więc.

Oto, co naprawdę się dzieje:

  1. Kod wykonuje odnośnika JNDI java:comp/env/DB2_DB.
  2. WebSphere używa zastrzeżonego przez WAS deskryptora wdrażania (ibm-web-bnd.xml), aby "przetłumaczyć" powiązanie aplikacji DB2_DB na rzeczywistą nazwę w drzewie JNDI WebSphere (jdbc/DB2DB).
  3. WebSphere wyszukuje numer jdbc/DB2DB i zwraca go do osoby dzwoniącej.

otrzymujesz NameNotFoundException na pierwszej Lookup - odnośnika z java:comp/env/DB2_DB. Problem nie polega na znalezieniu jdbc/DB2DB; to ze znalezieniem DB2_DB w środowisku twojego komponentu.

Twój deskryptor rozmieszczenia wygląda OK do mnie, więc zgaduję, że przyczyną problemu jest taka:

Context aContext = new InitialContext(settings); 

Jesteś konstruowaniu instancji InitialContext dostarczając Hashtable. Model Hashtable jest często przydatny, gdy trzeba podać specjalne parametry konstrukcji, , ale trzeba wiedzieć, kiedy go użyć i kiedy go unikać:. Kod działający wewnątrz kontenera JavaEE i potrzebuje prostego dostępu do drzewa JNDI kontenera rzadko, jeśli w ogóle, powinien dostarczyć dowolne Hashtable do konstruktora InitialContext.

I nie zdziwiłbym się, gdyby te settings że jesteś przejazdem w InitialContext zawierać, na przykład, PROVIDER_URL klucz instruowania odnośnika się stało na jakimś odległym drzewie JNDI zagranicznej.

Tak, chciałbym zacząć od złomowania, że ​​parametr:

Context aContext = new InitialContext(); 

A potem dać im kolejną szansę.

Jeśli to się nie powiedzie, użyj narzędzia WebSphere o numerze dumpNamespace, aby uzyskać wyraźny obraz drzewa JNDI produktu WebSphere.

0

I nie jestem pewien, co robi ibm-web-bnd.xml, jednak możesz spróbować dwóch rzeczy.

Najpierw możesz spróbować wykonać globalne wyszukiwanie. Wypróbuj:

aContext.lookup("jdbc/DB2DB"); 

Zakładam, że źródło danych ma nazwę "jdbc/DB2DB" z konfiguracją źródła danych.

W przeciwnym razie sprawdź, czy w Twoim zgłoszeniu znajduje się datasource is mapped. Domyślam się, że ibm-web-bnd.xml powinien poprawnie skonfigurować mapowanie.

+0

ibm-web-bnd.xml to odwzorowanie z lokalnej nazwy zasobu na referencję JNDI w kontenerze. – Jackie