2012-04-29 17 views
7

cuando funciono el siguiente:¿por qué aparece javax.naming.NamingException aquí?

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 
} 
} 

que recibo las siguientes excepciones:

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 

que no conozco la razón de esta excepción, todos los demás servlets que necesitan conectarse a la base de datos con la url java:comp/env/jdbc/photog funciona bien.

+0

¿Podría publicar el código de un servlet para el que funciona esta conexión? –

+0

@Amit Bhargava ¿por qué lo necesitas? –

+0

Bueno, esperaba encontrar algunas diferencias entre los dos que explicaran por qué no funciona en este caso. –

Respuesta

12

El stacktrace insinúa que está utilizando Glassfish. Retire la pieza java:comp/env/. Ya es la raíz de contexto JNDI predeterminada. Solo en Tomcat debes especificarlo explícitamente. Además, debería invocar esto en el contexto de la aplicación web, no como una aplicación Java simple con main().


Sin relación al problema concreto, lo que realmente necesita para obtener el DataSourcecada? Creé una clase auxiliar que solo se obtiene una vez en el arranque de la aplicación web o en un inicializador estático. Es una aplicación amplia e insegura. Solo es necesario obtener el Connection (¡y está cerrado! No lo está cerrando, por lo que está perdiendo recursos de DB) cada vez que necesita disparar una consulta SQL.

+2

¿Por qué Tomcat solo necesita la parte 'java: comp/env'? Lo imaginé de la manera difícil. – asgs

+1

@asgs: No tengo idea. Los chicos de Tomcat lo decidieron así. Tomcat no es un contenedor completo de Java EE de todos modos. – BalusC

+0

BalusC OK, gracias por el consejo sobre 'DataSource'. – asgs

Cuestiones relacionadas