Dan*_*nny 114 spring factory jndi jdbc
我花了太多时间在连接一些JNDI工厂bean时试图找出一些错误.结果问题是,而不是......
<bean id="someId" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName" value="java:comp/env/jdbc/loc"/>
</bean>
Run Code Online (Sandbox Code Playgroud)
我其实写了这个......
<bean id="someId" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName" value="jdbc/loc"/>
</bean>
Run Code Online (Sandbox Code Playgroud)
我推断java:comp/env /可能引用了一些环境变量,并最终使我的上下文文件被查看.唯一的区别是java:comp/env /.从专家的口中,这是做什么的?
如果没有值中的java:comp/env前缀,我将收到一条错误,指出"Name jdbc未绑定在此Context中".
che*_*vim 98
在命名空间的根上下文中是名称为"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>
Run Code Online (Sandbox Code Playgroud)
然后您可以使用以下方式直接访问它
Context ctx = new InitialContext();
DataSource ds = (DataSource)ctx.lookup("java:comp/env/foo");
Run Code Online (Sandbox Code Playgroud)
或者你可以做一个中间步骤,这样你就不必为你检索的每个资源都指定"java:comp/env":
Context ctx = new InitialContext();
Context envCtx = (Context)ctx.lookup("java:comp/env");
DataSource ds = (DataSource)envCtx.lookup("foo");
Run Code Online (Sandbox Code Playgroud)
Fil*_*nov 36
还有一个属性resourceRef
的JndiObjectFactoryBean
,则设置为当true
用于自动在前面加上字符串,java:comp/env/
如果它不存在.
<bean id="someId" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName" value="jdbc/loc"/>
<property name="resourceRef" value="true"/>
</bean>
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
113839 次 |
最近记录: |