2010-11-04 14 views
101

Acabo de pasar demasiado tiempo tratando de descubrir algunos errores al conectar un bean de fábrica JNDI. El problema resultó ser que en lugar de esto ...¿Qué hace java: comp/env/do?

<bean id="someId" class="org.springframework.jndi.JndiObjectFactoryBean"> 
    <property name="jndiName" value="java:comp/env/jdbc/loc"/> 
</bean> 

De hecho, me había escrito esto ...

<bean id="someId" class="org.springframework.jndi.JndiObjectFactoryBean"> 
    <property name="jndiName" value="jdbc/loc"/> 
</bean> 

deduzco que el java: comp/env/quizá hace referencia a alguna variable de entorno y lo hace para que, finalmente, mi archivo de contexto sea mirado. La única diferencia es java: comp/env /. Por la boca de un experto, ¿qué hace eso?

Sin el prefijo java: comp/env en el valor, me sale un error que dice "El nombre jdbc no está vinculado en este contexto".

+3

¿Cuál usó inicialmente? Su pregunta implica que estaba usando incorrectamente el segundo ejemplo ('jdbc/loc' y por lo tanto' java: comp/env/jdbc/loc' es correcto), mientras que la respuesta de cherouvim implica que estaba usando incorrectamente el primer ejemplo (' java: comp/env/jdbc/loc' y por lo tanto 'jdbc/loc' es correcto). De todos modos, la respuesta real es: depende del contexto ** actual **. – BalusC

+1

El que no funcionó realmente no tenía java: comp/env/jdbc/loc, como está implícito. El archivo de contexto que se señaló incluía el recurso "loc". ¿Cuáles son las posibilidades para los contextos "actuales"? – Danny

Respuesta

90

Citando https://web.archive.org/web/20140227201242/http://v1.dione.zcu.cz/java/docs/jndi-1.2/tutorial/beyond/misc/policy.html

En el contexto de la raíz del espacio de nombres es una unión con el nombre de "borrador", que está unido a un subárbol reservada para los enlaces relacionados componentes. El nombre "comp" es la abreviatura de componente. No hay otras vinculaciones en el contexto raíz . Sin embargo, la raíz contexto está reservado para el futuro expansión de la política, específicamente para dar nombre a los recursos que están vinculados no al componente en sí, sino a otros tipos de entidades como usuarios o departamentos. Por ejemplo, las futuras políticas podrían permitirle nombrar usuarios y organizaciones/departamentos utilizando los nombres tales como "java: usuario/alice" y "java: org/engineering".

En el contexto "comp", hay dos enlaces : "env" y "UserTransaction". El nombre "env" está vinculado a un subárbol que está reservado para los enlaces relacionados con el entorno del componente , como definido por su descriptor de implementación. "env" es la abreviatura de medio ambiente. El J2EE recomienda (pero no requiere) la siguiente estructura para el espacio de nombres "env" .

Así que la unión se hizo a partir de la primavera o, por ejemplo, de un descriptor de contexto de Tomcat ir por defecto en java: comp/env/

Por ejemplo, si la configuración es:

<bean id="someId" class="org.springframework.jndi.JndiObjectFactoryBean"> 
    <property name="jndiName" value="foo"/> 
</bean> 

a continuación, se puede acceder a él directamente a través de:

Context ctx = new InitialContext(); 
DataSource ds = (DataSource)ctx.lookup("java:comp/env/foo"); 

o usted podría hacer un paso intermedio por lo que no tiene que especificar "j ava: comp/env" para cada recurso que recuperar:

Context ctx = new InitialContext(); 
Context envCtx = (Context)ctx.lookup("java:comp/env"); 
DataSource ds = (DataSource)envCtx.lookup("foo"); 
+0

Pensé que había entendido esto correctamente, pero otros comentarios me hicieron darme cuenta de que lo había hecho al revés. Si el descriptor de contexto tomcat fue, por defecto, bajo java: comp/env, ¿no significa que puedo omitir java: comp/env del valor? En mi caso, tuve que agregarlo para que desaparezca el error "El nombre jdbc no está vinculado en este contexto". – Danny

+4

Se vincula usando "foo" y búsqueda usando "java: comp/env/foo". Eche un vistazo a http://blog.cherouvim.com/javax-sql-datasource-exposed-through-jndi/ – cherouvim

+3

El enlace de arriba es del tutorial JNDI independiente, originalmente disponible en: http://docs.oracle.com /javase/jndi/tutorial/beyond/misc/policy.html. –

33

Existe también una propiedad resourceRef de JndiObjectFactoryBean es decir, cuando se establece en true, que se utiliza para anteponer automáticamente la cadena java:comp/env/ si no está ya presente.

<bean id="someId" class="org.springframework.jndi.JndiObjectFactoryBean"> 
    <property name="jndiName" value="jdbc/loc"/> 
    <property name="resourceRef" value="true"/> 
</bean> 
+0

Gracias, realmente funciona tanto con Tomcat como con Glassfish. –

+0

También funciona con Tomcat y Jetty. – txedo

1

Después de varios intentos y profundizar en el código fuente de Tomcat descubrí que la propiedad sencilla useNaming="false" hizo el truco !! Ahora Tomcat resuelve los nombres java:/liferay en lugar de java: comp/env/liferay