查找jndi资源WebSphere 8.5,Spring 3.1.3,Hibernate 4.1.10 EJB 3

时间:2014-12-17 16:16:23

标签: spring hibernate ejb websphere lookup

在我的应用程序中,我需要查找用于数据库连接的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?你有完整的例子吗?

2 个答案:

答案 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"/>