¿Qué hace java: comp / env / do?

Acabo de pasar demasiado tiempo tratando de descubrir algunos errores cuando conecto un frijol de fábrica JNDI. El problema resultó ser que en lugar de esto …

   

De hecho, he escrito esto …

    

Debo inferir que java: comp / env / quizás hace referencia a alguna variable de entorno y lo hace para que, en última instancia, 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, obtendría un error que decía “Nombre jdbc no está vinculado en este contexto”.

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 raíz del espacio de nombres hay un enlace con el nombre “comp”, que está vinculado a un subárbol reservado para enlaces relacionados con componentes. El nombre “comp” es la abreviatura de componente. No hay otras vinculaciones en el contexto raíz. Sin embargo, el contexto raíz está reservado para la expansión futura de la política, específicamente para nombrar recursos que no están vinculados al componente en sí, sino a otros tipos de entidades, como usuarios o departamentos. Por ejemplo, las políticas futuras podrían permitirle nombrar usuarios y organizaciones / departamentos utilizando nombres como “java: user / 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, tal como se define en 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”.

Por lo tanto, la vinculación que hizo desde la spring o, por ejemplo, desde un descriptor de contexto tomcat va por defecto en java: comp / env /

Por ejemplo, si su configuración es:

    

Entonces puede acceder directamente usando:

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

o puede hacer un paso intermedio para no tener que especificar “java: comp / env” para cada recurso que recupera:

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

También hay una propiedad resourceRef de JndiObjectFactoryBean que, cuando se establece en true , se usa para anteponer automáticamente la cadena java:comp/env/ si no está presente.

     

Después de varios bashs y profundizar en el código fuente de Tomcat, descubrí que la propiedad simple useNaming = “false” funcionaba bien. Ahora Tomcat resuelve los nombres java: / liferay en lugar de java: comp / env / liferay