Java: comp/env/做什么?

我只是花了太多的时间试图在连接一些 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>

I infer that the java:comp/env/ perhaps references some environment variable and makes it so that, ultimately, my context file is looked at. The only difference is java:comp/env/. From an expert's mouth, what does that do?

如果值中没有 java:comp/env/前缀,就会得到一个表示 “ Name jdbc 不在此上下文中绑定”的错误。

129128 次浏览

引用 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”。 The name "env" is bound to a subtree 保留给组件的 与环境有关的约束力,例如 由它的部署描述符来定义。 “ env”是环境的简称 J2EE 推荐(但不要求) “ env”的下列结构 命名空间。

So the binding you did from spring or, for example, from a tomcat context descriptor go by default under 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");

还有一个 JndiObjectFactoryBean的属性 resourceRef,当设置为 true时,如果字符串 java:comp/env/还没有出现,则用于自动预置该字符串。

<bean id="someId" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName" value="jdbc/loc"/>
<property name="resourceRef" value="true"/>
</bean>

经过几次尝试并深入研究 Tomcat 的源代码后,我发现简单的属性 UseNaming = “ false”起到了作用! !现在 Tomcat 解析名称 Java:/liferay而不是 Java: comp/env/liferay