在我的应用程序中,我需要查找用于数据库连接的jndi资源。
我有一个包含远程和无状态ejb的EJB项目的EAR:ABean.jar
阅读我定义的Using Spring and Hibernate with WebSphere Application Server
在EAR项目的application.xml
中:
<module>
<ejb>ABean.jar</ejb>
</module>
<resource-ref>
<res-ref-name>jdbc/b</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
<res-sharing-scope>Shareable</res-sharing-scope>
</resource-ref>
在我春天的背景下:
<jee:jndi-lookup
id="aDataSource"
jndi-name="jdbc/b"
cache="true"
expected-type="javax.sql.DataSource"/>
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="persistenceXmlLocation" value="META-INF/persistence.xml"/>
<property name="dataSource" ref="aDataSource" />
<property name="persistenceUnitName" value="APU"/>
<property name="jpaProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.DB2390Dialect</prop>
<prop key="hibernate.show_sql">true</prop>
</props>
</property>
<property name="jpaDialect">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaDialect" />
</property>
</bean>
现在,如果我通过WebSphere控制台安装应用程序,它会要求我将jndi资源分配给jdbc/b
(并且没关系),但如果我尝试调用ejb,则NameNotFoundException
抛出是因为找不到jdbc/b
!
更好地阅读上一个链接,我看到了:
对于EJB JAR文件,应在每个需要访问数据源的EJB中声明相同的resource-ref。
所以我尝试将资源引用定义到我的ejb-jar.xml
<enterprise-beans>
<session>
<ejb-name>TestServiceBean</ejb-name>
<ejb-class>it.test.TestServiceBean</ejb-class>
<session-type>Stateless</session-type>
<transaction-type>Container</transaction-type>
<resource-ref>
<res-ref-name>jdbc/b</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
</resource-ref>
</session>
</enterprise-beans>
我尝试再次安装(我还将jndi资源分配给jdbc/b
)并且对ejb的调用成功运行,但是如果我有n ejb,我是否需要分配n次相同的jndi资源到jdbc / b的n ejb resource-ref?
我的配置有什么问题?不可能&#34;指向&#34;从所有ejb到同一个resource-ref
?你有完整的例子吗?
答案 0 :(得分:1)
根据EE 6规范,application.xml
中声明的引用必须位于java:app
(或java:global
)命名空间中,建议它们位于env
子上下文,所以:
<res-ref-name>java:app/env/jdbc/b</res-ref-name>
这将允许资源对应用程序中的所有组件可见。或者,您可以在ejb-jar.xml中的java:module
上下文中或通过注释声明引用。
答案 1 :(得分:0)
更新了答案。基于bkail answer的示例。您需要在application.xml
中定义资源引用,如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<application xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/application_6.xsd" version="6">
<display-name>RefTestEAR</display-name>
....
<resource-ref>
<res-ref-name>java:app/env/jdbc/b</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
</application>
然后在您的应用程序中,您可以通过以下方式访问它:
InitialContext ctx = new InitialContext();
DataSource datasource = (DataSource) ctx.lookup("java:app/env/jdbc/b");
在您的情况下,因为您直接使用Spring
而不是InitialContext
,您可能需要更改查找,并验证您是否在persistence.xml
中有数据源引用(我没有&# 39; t测试在Spring,因为我手边没有Spring样本):
<jee:jndi-lookup
id="aDataSource"
jndi-name="java:app/env/jdbc/b"
cache="true"
expected-type="javax.sql.DataSource"/>