一尘不染

java:comp / env /做什么?

spring

我一天中花了太多时间试图找出一些连接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在此上下文中未绑定”。


阅读 675

收藏
2020-04-13

共1个答案

一尘不染

在名称空间的根上下文中是名称为“ 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");
2020-04-13