Pasé demasiado tiempo de mi día tratando de descubrir algunos errores al conectar un bean 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, había escrito esto ...
<bean id="someId" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName" value="jdbc/loc"/>
</bean>
Infiero que java:comp/env/
quizás hace referencia a alguna variable de entorno y lo hace de modo que, en última instancia, se examine mi archivo de contexto. La única diferencia es java:comp/env/
. De la boca de un experto, ¿qué hace eso?
Sin el java:comp/env/
prefijo en el valor, obtendría un error que decía "El nombre jdbc no está vinculado en este contexto" .
jdbc/loc
y por lo tantojava: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 tantojdbc/loc
es correcto). Independientemente, la respuesta real es: depende del contexto actual .Respuestas:
Citando https://web.archive.org/web/20140227201242/http://v1.dione.zcu.cz/java/docs/jndi-1.2/tutorial/beyond/misc/policy.html
Entonces, el enlace que hizo desde Spring o, por ejemplo, desde un descriptor de contexto de Tomcat, va por defecto en java: comp / env /
Por ejemplo, si su configuración es:
Entonces puedes acceder a él directamente usando:
o puede realizar un paso intermedio para no tener que especificar "java: comp / env" para cada recurso que recupere:
fuente
También hay una propiedad
resourceRef
deJndiObjectFactoryBean
que, cuando se establece entrue
, se usa para anteponer automáticamente la cadenajava:comp/env/
si aún no está presente.fuente
Después de varios intentos y profundizando en el código fuente de Tomcat, descubrí que la propiedad simple useNaming = "false" funcionó. Ahora Tomcat resuelve los nombres java: / liferay en lugar de java: comp / env / liferay
fuente