2012-04-29 10 views
7

kiedy uruchomić następujące:Dlaczego występuje tutaj wyjątek javax.naming.NamingException?

package NonServletFiles; 
import java.sql.Connection; 
import java.sql.PreparedStatement; 
import java.sql.ResultSet; 
import javax.sql.DataSource; 
import javax.naming.*; 

public class GetTagsFromDatabase { 

public GetTagsFromDatabase() { 

} 

public String[] getTags() { 

    String tags[] = null; 
    try { 
     Context context = new InitialContext(); 
     DataSource ds = (DataSource)context.lookup("java:comp/env/jdbc/photog"); // <<----- line 23 
     Connection connection = ds.getConnection(); 
     String sqlQuery = "select NAMEOFTHETAG from tagcollection"; 
     PreparedStatement statement = connection.prepareStatement(sqlQuery); 
     ResultSet set = statement.executeQuery(); 

     int i = 0; 
     while(set.next()) { 
      tags[i] = set.getString("NameOfTheTag"); 
      System.out.println(tags[i]); 
      i++; 
     } 
    }catch(Exception exc) { 
     exc.printStackTrace(); 
    } 

    return tags; 
} 

public static void main(String args[]) { 
    new GetTagsFromDatabase().getTags(); // <<----- line 43 
} 
} 

uzyskać następujące wyjątki:

javax.naming.NamingException: Lookup failed for 'java:comp/env/jdbc/photog' in SerialContext[myEnv={java.naming.factory.initial=com.sun.enterprise.naming.impl.SerialInitContextFactory, java.naming.factory.url.pkgs=com.sun.enterprise.naming, java.naming.factory.state=com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl} [Root exception is javax.naming.NamingException: Invocation exception: Got null ComponentInvocation ] 
at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:518) 
at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:455) 
at javax.naming.InitialContext.lookup(InitialContext.java:411) 
at NonServletFiles.GetTagsFromDatabase.getTags(GetTagsFromDatabase.java:23) 
at NonServletFiles.GetTagsFromDatabase.main(GetTagsFromDatabase.java:43) 

Caused by: javax.naming.NamingException: Invocation exception: Got null ComponentInvocation 
at com.sun.enterprise.naming.impl.GlassfishNamingManagerImpl.getComponentId(GlassfishNamingManagerImpl.java:873) 
at com.sun.enterprise.naming.impl.GlassfishNamingManagerImpl.lookup(GlassfishNamingManagerImpl.java:742) 
at com.sun.enterprise.naming.impl.JavaURLContext.lookup(JavaURLContext.java:172) 
at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:498) 
... 4 more 

nie znam przyczyny tego wyjątku, wszystkie inne serwlety, które wymagają, aby połączyć się z bazą danych adres URL: java:comp/env/jdbc/photog działa dobrze.

+0

Czy możesz umieścić kod serwletu, dla którego działa to połączenie? –

+0

@Amit Bhargava, dlaczego tego potrzebujesz? –

+0

Cóż, miałem nadzieję znaleźć pewne różnice między tymi dwoma, które wyjaśniałyby, dlaczego to nie działa w tym przypadku. –

Odpowiedz

12

Wskazówki dotyczące stacktrace, że używasz Glassfish. Usuń część java:comp/env/. Jest to domyślny katalog kontekstowy JNDI. Tylko w Tomcat musisz go jawnie określić. Powinieneś także wywoływać to w kontekście webapp, a nie jako zwykłą aplikację Java z main().


niezwiązane do konkretnego problemu, czy naprawdę trzeba uzyskać DataSourcespędzaj? Utworzyłem klasę pomocniczą, która uzyska ją tylko raz podczas uruchamiania aplikacji internetowej lub w inicjalizatorze statycznym. Ma szerokie zastosowanie i wątki bezpieczne. Trzeba tylko uzyskać Connection (i zamknąć, nie zamykasz go, więc tracisz zasoby DB) za każdym razem, gdy potrzebujesz odpalić zapytanie SQL.

+2

Dlaczego sam Tomcat potrzebuje części 'java: comp/env'? Uznałem to za trudną. – asgs

+1

@asgs: Nie mam pojęcia. Chłopaki Tomcat tak zdecydowali. Tomcat i tak nie jest pełnoprawnym kontenerem Java EE. – BalusC

+0

BalusC OK, dzięki za wskazówkę na 'DataSource'. – asgs