2011-06-17 10 views
18

Jak sugeruje tytuł, co oznacza wyrażenie "javax.naming.NoInitialContextException" w terminach nietechnicznych? A jakie są ogólne sugestie, aby to naprawić?Co oznacza "javax.naming.NoInitialContextException"?

EDIT (z konsoli):

javax.naming.NoInitialContextException: Need to specify class name in environment or system property, or as an applet parameter, or in an application resource file: java.naming.factory.initial 
    at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:645) 
    at javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:288) 
    at javax.naming.InitialContext.getURLOrDefaultInitCtx(InitialContext.java:325) 
    at javax.naming.InitialContext.lookup(InitialContext.java:392) 
    at cepars.app.ConnectionHelper.getConnection(ConnectionHelper.java:25) 
    at cepars.app.ConnectionHelper.getConnection(ConnectionHelper.java:10) 
    at cepars.review.ReviewDAO.getJobList(ReviewDAO.java:30) 
    at cepars.review.Test.main(Test.java:43) 
java.lang.NullPointerException 
    at cepars.review.ReviewDAO.getJobList(ReviewDAO.java:31) 
    at cepars.review.Test.main(Test.java:43) 
cepars.app.DAOException 
    at cepars.review.ReviewDAO.getJobList(ReviewDAO.java:39) 
    at cepars.review.Test.main(Test.java:43) 
+1

To po prostu oznacza, że ​​istnieje wyjątkowa okoliczność, w której nie można stworzyć kontekstu początkowego, a zatem kod nie może być kontynuowany z poleceniami. Wiadomość i stacktrace zawierają znacznie ważniejsze informacje. Udostępnij je również, aby móc naprawić główną przyczynę problemu. – BalusC

+0

Duplikat nie ma zaakceptowanej odpowiedzi. Proszę nie twierdzić, że pytania mają odpowiedź, gdy nie mają akceptowanej odpowiedzi. –

+0

Miałem coś takiego, gdy w java ee był przy użyciu CDI, tj. @Injection i spróbuj zbyt uruchomić testy integracyjne Junit bez RunWith (Arquillian.class)! –

Odpowiedz

13

To w zasadzie oznacza, że ​​aplikacja chce wykonać pewne operacje „nazewnictwa” (np JNDI lub LDAP wyszukiwań), i nie mają wystarczające informacje dostępne, aby móc utworzyć połączenie z serwerem katalogów. Jak docs dla państwa wyjątku

To jest wyjątek, gdy nie początkowa realizacja kontekst można utworzony. Strategia wyboru początkowej implementacji kontekstu jest opisana w dokumentacji klasy InitialContext .

A jeśli sumiennie przyjrzeć się z Javadocs dla InitialContext, opisują one dość dobrze, jak początkowy kontekst jest zbudowany i jakie opcje są do zaopatrywania adres/referencje/etc.

Jeśli chcesz utworzyć kontekst i utknąć w innym miejscu, opublikuj wyjaśnienie, co zrobiłeś do tej pory i gdzie masz problemy.

6

Wystarczy przeczytać the docs:

To jest wyjątek, gdy nie początkowa realizacja kontekst może być utworzony. Strategia wyboru początkowej implementacji kontekstu jest opisana w dokumentacji klasy InitialContext .

Wyjątek może zostać wygenerowany w interakcji z InitialContext, a nie tylko wtedy, gdy InitialContext jest wykonana. W przypadku przykładu implementacja kontekstu początkowego może leniwie odzyskiwać kontekst tylko wtedy, gdy wywoływane są rzeczywiste metody: . Aplikacja nie powinna mieć żadnej zależności od tego, czy określony kontekst początkowy jest określony.

Ale to wyjaśnia wiele lepiej w docs dla InitialContext

+0

@Oracle: 'InitialContext' to bardzo głupie, pozbawione znaczenia imię. Jest to kombinacja nic nie mówiących słów _initial_ i _context_, które mogą być używane do wszystkiego i wszędzie. Również powyższy akapit używa słowa _context_8 (osiem) razy, aby wyjaśnić słowo _InitialContext_. Lepszą nazwą byłoby 'JavaNamingAndDirectoryInitialContext' lub przynajmniej' NamingAndDirectoryInitialContext'. Albo lepiej przemyśl całą nazwę i podaj imiona, które coś znaczą. Oczywiście JNDI jest trochę abstrakcyjne, ale _InitialContext_ jest naprawdę złym wyborem, jak sądzę. – aliopi

+1

Uzgodnione. Ale prawdopodobnie powinieneś zająć się tą krytyką w Oracle. Strzelasz do posłańca tutaj –

27

Oznacza to, że nie ma początkowy kontekst :)

Ale poważnie ludzie, JNDI (javax.naming) jest o patrząc przedmiotów lub środków z jakiegoś katalogu lub dostawcy. Aby coś wyszukać, trzeba gdzieś spojrzeć (jest to InitialContext). NoInitialContextException oznacza "Chcę znaleźć numer telefonu dla Johna Smitha, ale nie mam książki telefonicznej, aby zaglądać".

InitialContext można utworzyć na wiele sposobów. Można to zrobić ręcznie, na przykład tworząc połączenie z serwerem LDAP. Może być również skonfigurowany przez serwer aplikacji, na którym uruchamiasz swoją aplikację.W takim przypadku kontener (serwer aplikacji) zapewnia już "książkę telefoniczną", dzięki której można wyszukać wszystko, co udostępnia serwer aplikacji. Często jest to konfigurowalny i powszechny sposób przenoszenia tego typu konfiguracji z wdrożenia aplikacji do kontenera, gdzie można go współużytkować we wszystkich aplikacjach na serwerze.

AKTUALIZACJA: z opublikowanego fragmentu kodu wygląda na to, że próbujesz uruchomić autonomiczny kod, który ma działać na serwerze aplikacji. W tym przypadku kod próbuje uzyskać połączenie z bazą danych z "książki telefonicznej". Jest to jeden z zasobów często konfigurowanych w kontenerze serwera aplikacji. Zamiast więc zarządzać konfiguracją i połączeniami z bazą danych w twoim kodzie, możesz skonfigurować ją na swoim serwerze aplikacji i poprosić o połączenie (używając JNDI) w swoim kodzie.

+4

Podobała mi się analogia do książki telefonicznej. Osobiście wciąż nie rozumiem szczegółów, ale twoja odpowiedź dała mi pogląd koncepcyjny. – user2316667

-1

W bardzo nie-technicznych terminach może to oznaczać, że zapomniałeś wstawić "ejb:" lub "jdbc:" lub coś na samym początku identyfikatora URI, z którym próbujesz się połączyć.