我花了太多时间在连接一些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未绑定在此上下文中”。
答案 0 :(得分:97)
在命名空间的根上下文中 是一个名为“comp”的绑定, 绑定到保留的子树 与组件相关的绑定。该 name“comp”是组件的缩写。 没有其他绑定 根上下文。但是,根 上下文保留给未来 特别是政策的扩展 用于命名不受限制的资源 组件本身,但其他 用户或的实体类型 部门。例如,未来 策略可能允许您为用户命名 和组织/部门使用 名称如“java:user / alice”和 “java的:组织/工程”
在“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");
答案 1 :(得分:36)
还有resourceRef
的{{1}}属性,当设置为JndiObjectFactoryBean
时,用于自动添加字符串true
(如果尚未存在)。< / p>
java:comp/env/
答案 2 :(得分:4)
经过多次尝试并深入挖掘Tomcat的源代码后,我发现简单的属性useNaming="false"就行了!现在Tomcat解析名称 java:/ liferay 而不是 java:comp / env / liferay