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> 

我推断java:comp / env /可能会引用一些环境variables,并使得它最终会查看我的上下文文件。 唯一的区别是java:comp / env /。 从专家的口中,这是做什么的?

如果在值中没有java:comp / env前缀,我会得到一个错误,指出“名称jdbc未在此上下文中绑定”。

引用https://web.archive.org/web/20140227201242/http://v1.dione.zcu.cz/java/docs/jndi-1.2/tutorial/beyond/misc/policy.html

在名称空间的根上下文中是名为“comp”的绑定,绑定到为组件相关绑定保留的子树。 名称“comp”是组件的简称。 根上下文中没有其他绑定。 然而,根上下文被保留用于未来的策略扩展,特别是命名与组件本身不相关的资源,而是与用户或部门等其他types的实体相关联。 例如,将来的策略可能允许您使用“java:user / alice”和“java:org / engineering”等名称来命名用户和组织/部门。

在“comp”上下文中,有两个绑定:“env”和“UserTransaction”。 名称“env”被绑定到为组件的环境相关绑定保留的子树,如其部署描述符所定义的。 “env”是环境的简称。 J2EEbuild议(但不要求)“env”命名空间的以下结构。

因此,你从spring或者tomcat上下文描述符所做的绑定在java:comp / env /

例如,如果您的configuration是:

 <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 ,如果它不存在的话,它会自动预先加载stringjava: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”做了诡计! 现在,Tomcatparsing了名称java:/ liferay而不是java:comp / env / liferay