我只是花了太多时间试图找出连接某些 JNDI 工厂 bean 时出现的一些错误。问题结果是,而不是这个......
<bean id="someId" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName" value="java:comp/env/jdbc/loc"/>
</bean>
其实这个是我写的...
<bean id="someId" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName" value="jdbc/loc"/>
</bean>
我推断java:comp/env/
也许引用了一些环境变量并使其最终能够查看我的上下文文件。唯一的区别是java:comp/env/
。从专家嘴里说出来,那有什么作用呢?
如果没有java:comp/env/
值中的前缀,我会收到一条错误消息“名称 jdbc 在此上下文中未绑定”.
Quoting https://web.archive.org/web/20140227201242/http://v1.dione.zcu.cz/java/docs/jndi-1.2/tutorial/beyond/misc/policy.html
在命名空间的根上下文中
是一个名为“comp”的绑定,
绑定到保留的子树
用于组件相关的绑定。这
名称“comp”是组件的缩写。
没有其他绑定
根上下文。然而,根
上下文是为未来保留的
扩大政策范围,特别是
用于命名未绑定的资源
对于组件本身,但对于其他组件
实体类型,例如用户或
部门。例如,未来
策略可能允许您命名用户
和组织/部门通过使用
诸如“java:user/alice”之类的名称和
“java:org/engineering”。
在“comp”上下文中,有两个
绑定:“env”和“UserTransaction”。
名称“env”绑定到子树
为组件保留的
与环境相关的绑定,如
由其部署描述符定义。
“env”是环境的缩写。这
J2EE推荐(但不要求)
“env”的以下结构
命名空间。
因此,您从 spring 或例如 tomcat 上下文描述符进行的绑定默认位于 java:comp/env/ 下
例如,如果您的配置是:
<bean id="someId" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName" value="foo"/>
</bean>
然后您可以使用以下方式直接访问它:
Context ctx = new InitialContext();
DataSource ds = (DataSource)ctx.lookup("java:comp/env/foo");
或者您可以执行中间步骤,这样您就不必为检索的每个资源指定“java:comp/env”:
Context ctx = new InitialContext();
Context envCtx = (Context)ctx.lookup("java:comp/env");
DataSource ds = (DataSource)envCtx.lookup("foo");
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)