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 /可能会引用一些环境变量,并使其最终导致我的上下文文件被查看。 唯一的区别是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”是组件的简称。 在根上下文中没有其他绑定。 然而,根上下文被保留用于未来的策略扩展,特别是命名与组件本身不相关的资源,但是与其他类型的实体(例如用户或部门)相关联。 例如,未来的策略可能允许您通过使用诸如“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");

还有一个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

链接地址: http://www.djcxy.com/p/65343.html

上一篇: What does java:comp/env/ do?

下一篇: Selenium tests with dockers or without