我一天中花了太多时间试图找出一些连接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/
java:comp/env/在值中没有前缀的情况下,我将收到一条错误消息,指出“名称jdbc在此上下文中未绑定”。
在名称空间的根上下文中是名称为“ 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");