java - Ayuda a configurar JNDI con JBoss incrustado en Tomcat 5.5.x
seam embedded-jboss (3)
Cuando intento la siguiente búsqueda en mi código:
Context initCtx = new InitialContext();
Context envCtx = (Context) initCtx.lookup("java:comp/env");
return (DataSource) envCtx.lookup("jdbc/mydb");
Obtengo la siguiente excepción:
java.sql.SQLException: QueryResults: Unable to initialize naming context:
Name java:comp is not bound in this Context at
com.onsitemanager.database.ThreadLocalConnection.getConnection
(ThreadLocalConnection.java:130) at
...
Instalé JBoss incrustado siguiendo las instrucciones de la wiki de JBoss. Y configuré Tomcat usando la implementación "Escaneando cada WAR por defecto" como se especifica en la página wiki de configuración .
Citando la página de configuración:
JNDI
Los componentes integrados de JBoss como la agrupación de conexiones, EJB, JPA y las transacciones hacen un uso extensivo de JNDI para publicar servicios. Embedded JBoss anula la implementación de JNDI de Tomcat superponiéndose a la instanciación de JNDI de Tomcat. Hay algunas razones para esto:
- Para evitar tener que declarar todos y cada uno de estos servicios dentro de server.xml
- Permitir una integración sin problemas del espacio de nombres java: comp entre aplicaciones web y EJB.
- La implementación de JNDI de Tomcat tiene algunos errores críticos que obstaculizan la capacidad de algunos componentes de JBoss para funcionar
- Queremos brindarle la opción de tener acceso remoto a los EJB y otros servicios que pueden ser "buscados remotamente"
¿Alguien tiene alguna idea sobre cómo puedo configurar el servicio de nombres de JBoss que, de acuerdo con la cita anterior, está anulando la implementación de JNDI de Tomcat para que pueda hacer una búsqueda en java: comp / env?
FYI - Mi entorno Tomcat 5.5.9, Seam 2.0.2sp, Embedded JBoss (Beta 3),
Nota: Tengo un archivo -ds.xml para la conexión de mi base de datos correctamente configurado y accesible en la ruta de clase según las instrucciones.
También tenga en cuenta: He publicado esta pregunta en el foro integrado de Jboss y en el foro de usuarios de costura.
Gracias por el kit de herramientas de respuesta .... sí, puedo acceder a mi fuente de datos yendo directamente a java: jdbc / mydb, pero estoy usando una base de código existente que se conecta a través de la ENC. Aquí hay información interesante que descubrí ...
El código anterior funciona con JBoss 4.2.2.GA y aquí están los parámetros JNDI ctx utilizados:
java.naming.factory.initial = org.jnp.interfaces.NamingContextFactory java.naming.factory.url.pkgs = org.jboss.naming: org.jnp.interfaces: org.jboss.naming: org.jnp.interfacesEl código anterior funciona con Tomcat 5.5.x y aquí están los parámetros JNDI ctx utilizados:
java.naming.factory.initial = org.apache.naming.java.javaURLContextFactory java.naming.factory.url.pkgs = org.apache.namingEl código anterior falla con Embedded JBoss (Beta 3) en Tomcat 5.5.x con el mensaje de error anterior.
java.naming.factory.initial = org.apache.naming.java.javaURLContextFactory java.naming.factory.url.pkgs = org.apache.namingEl código anterior falla con el error anterior al usar JBoss Embedded en tomcat 5.5.x
Alguien tiene alguna idea de lo que debo hacer con la configuración de JBoss JNDI integrada?
Tuve un problema similar con Jboss Embedded y finalmente soluciono la reproducción en el archivo: test-Datasource-ds.xml
agregando
<mbean code="org.jboss.naming.NamingAlias" name="jboss.jmx:alias=testDatasource">
<attribute name="FromName">jdbc/Example DataSource</attribute>
<attribute name="ToName">java:/testDatasource</attribute>
</mbean>
El problema era que jboss agregara el prefijo java: / para todas las fuentes de datos declaradas. Así que finalmente tuve un origen de datos llamado testDatasource, anulado con esa directiva a jdbc / Example DataSource
Espero que funcione
java: comp / env se conoce como Contexto de nomenclatura empresarial (ENC) y no es visible globalmente. Mira aquí para más información. Necesitará ubicar el nombre JNDI global al que se registra el origen de datos.
La forma más fácil de hacerlo es navegar a la consola JMX de JBoss basada en la web y buscar un JOBDiew (no estoy seguro del nombre - actualmente en casa) mbean. Este mbean debe tener un método de lista que pueda invocar, que mostrará la ruta de contexto para todos los objetos vinculados a JNDI.