spring - mvc - ¿Qué hace java: comp/env/do?
spring hibernate jndi (3)
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 primavera o, por ejemplo, desde un descriptor de contexto tomcat va por defecto en java: comp / env /
Por ejemplo, si su configuración es:
<bean id="someId" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName" value="foo"/>
</bean>
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");
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 ...
<bean id="someId" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName" value="java:comp/env/jdbc/loc"/>
</bean>
De hecho, he escrito esto ...
<bean id="someId" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName" value="jdbc/loc"/>
</bean>
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".
Después de varios intentos y profundizar en el código fuente de Tomcat, descubrí que la propiedad simple useNaming="false" Ahora Tomcat resuelve los nombres java: / liferay en lugar de java: comp / env / liferay
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.
<bean id="someId" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName" value="jdbc/loc"/>
<property name="resourceRef" value="true"/>
</bean>