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未在此上下文中绑定”。
在名称空间的根上下文中是名为“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