java:comp / env /做什么?

时间:2010-11-04 16:52:17

标签: spring jdbc jndi factory

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

3 个答案:

答案 0 :(得分:97)

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

  

在命名空间的根上下文中   是一个名为“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