2011-06-17 8 views
18

Como sugiere el título, ¿qué significa "javax.naming.NoInitialContextException" en términos no técnicos? ¿Y cuáles son algunas sugerencias generales para solucionarlo?¿Qué significa "javax.naming.NoInitialContextException"?

EDITAR (Desde la consola):

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

Simplemente significa que hay una circunstancia excepcional en la que no se puede crear un contexto inicial y, por lo tanto, el código no puede continuar con lo que se le dice que haga. El mensaje y la stacktrace contienen información mucho más importante. Compártalos también para poder solucionar la causa raíz del problema. – BalusC

+0

El duplicado no tiene una respuesta aceptada. No afirme que las preguntas tienen una respuesta cuando no tienen una respuesta aceptada. –

+0

He tenido algo así cuando en java ee estaba usando CDI, es decir, @Injection y también intenté ejecutar pruebas de integración Junit sin RunWith (Arquillian.class). –

Respuesta

13

Básicamente significa que la aplicación quiere llevar a cabo algunas "de operaciones de nombres" (por ejemplo JNDI o LDAP) Búsquedas de, y no tener suficiente información disponible para poder crear una conexión al servidor de directorio. A medida que la documentación para el estado de excepción,

Esta excepción se produce cuando no hay implementación de contexto inicial puede ser creado . La política de cómo se selecciona una implementación de contexto inicial es que se describe en la documentación de la clase InitialContext.

Y si diligentemente echar un vistazo a las javadocs para InitialContext, describen bastante bien cómo se construye el contexto inicial, y cuáles son sus opciones para el suministro de la direccion/credenciales/etc.

Si tiene que crear un contexto y quedarse atascado en otro lugar, publique de nuevo explicando lo que ha hecho hasta ahora y dónde va a encallar.

6

acaba de leer the docs:

Esta excepción se produce cuando no hay implementación de contexto inicial puede ser creado . La política de cómo se selecciona una implementación de contexto inicial es que se describe en la documentación de la clase InitialContext.

Esta excepción puede ser lanzado durante cualquier interacción con el InitialContext, no sólo cuando se construye el InitialContext. Para el ejemplo , la implementación del contexto inicial podría recuperar el contexto de forma perezosa solo cuando se invocan los métodos reales . La aplicación no debe tener ninguna dependencia cuando se determina la existencia de un contexto inicial .

Pero esto se explica mucho mejor en los documentos de InitialContext

+0

@Oracle: 'InitialContext' es un nombre muy tonto y sin sentido. Es una combinación de palabras que no dicen nada _initial_ y _context_, que se pueden usar para cualquier cosa, en cualquier lugar. También el párrafo anterior usa la palabra _context_ 8 (ocho) veces para explicar la palabra _InitialContext_. Un nombre mejor sería 'JavaNamingAndDirectoryInitialContext' o al menos' NamingAndDirectoryInitialContext'. O mejor, reconsidera el nombre completo y da nombres que signifiquen algo. Por supuesto, JNDI es un poco abstracto, pero _InitialContext_ es realmente una mala elección, creo. – aliopi

+1

De acuerdo. Pero probablemente deberías abordar esa crítica en Oracle. Estás grabando el messenger aquí –

27

Esto significa que no existe un contexto inicial :)

Pero hablando en serio, JNDI (javax.naming) es todo acerca de buscar objetos o recursos de algún directorio o proveedor. Para buscar algo, necesita un lugar para mirar (este es el InitialContext). NoInitialContextException significa "Deseo encontrar el número de teléfono de John Smith, pero no tengo una agenda para mirar".

Se puede crear un InitialContext de muchas formas. Se puede hacer manualmente, por ejemplo, creando una conexión a un servidor LDAP. También puede ser configurado por un servidor de aplicaciones dentro del cual ejecuta su aplicación.En este caso, el contenedor (servidor de aplicaciones) ya le proporciona un "directorio telefónico", a través del cual puede buscar cualquier cosa que el servidor de aplicaciones ponga a su disposición. Esto a menudo es configurable y una forma común de mover este tipo de configuración desde la implementación de la aplicación hasta el contenedor, donde se puede compartir en todas las aplicaciones en el servidor.

ACTUALIZACIÓN: desde el fragmento de código que publica parece que está intentando ejecutar un código autónomo que debe ejecutarse en un servidor de aplicaciones. En este caso, el código que intenta obtener una conexión a una base de datos desde el "directorio telefónico". Este es uno de los recursos que a menudo se configura en el contenedor del servidor de aplicaciones. Entonces, en lugar de tener que administrar la configuración y las conexiones a la base de datos en su código, puede configurarlo en su servidor de aplicaciones y simplemente solicitar una conexión (usando JNDI) en su código.

+4

Me gustó la analogía de la agenda telefónica. Personalmente todavía estoy confundido acerca de los detalles, pero su respuesta me dio la visión conceptual. – user2316667

-1

En términos extremadamente no técnicos, puede significar que olvidó poner "ejb:" o "jdbc:" o algo al principio del URI que está intentando conectar.