【问题标题】:Lookup jndi resources WebSphere 8.5, Spring 3.1.3, Hibernate 4.1.10 EJB 3查找 jndi 资源 WebSphere 8.5、Spring 3.1.3、Hibernate 4.1.10 EJB 3
【发布时间】:2014-12-17 16:16:23
【问题描述】:

在我的应用程序中,我需要查找用于数据库连接的 jndi 资源。

我有一个 EAR,其中包含我的 EJB 项目和远程无状态 ejb: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,因为 @ 987654328@未找到!

更好地阅读我看到的上一个链接:

对于 EJB JAR 文件,应在需要访问数据源的每个 EJB 中声明相同的资源引用。

所以我尝试将资源引用定义到我的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资源分配给n 用于 jdbc/b 的 ejb 资源引用?

我的配置有什么问题?难道不可能从所有ejb“指向”同一个resource-ref吗?有完整的例子吗?

【问题讨论】:

    标签: spring hibernate ejb websphere lookup


    【解决方案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 上下文中声明引用。

    【讨论】:

    • 你能用我的案例创建一个例子吗?因为如果我在尝试调用 ejb 时按照您所说的那样放置 java:app/env/,则会出现异常:上下文:NB-025Node01Cell/nodes/NB-025Node01/servers/server1,名称:jdbc/b:第一个组件在名称 b 中未找到。 [根例外是 org.omg.CosNaming.NamingContextPackage.NotFound: IDL:omg.org/CosNaming/NamingContext/NotFound:1.0]
    • 感谢 bkail,它有效!如果我在描述符中使用&lt;res-ref-name&gt;java:app/env/jdbc/myDs&lt;/res-ref-name&gt;,在ctx.lookup()中使用java:app/env/jdbc/myDs
    • 是的,它可以工作......只是在我使用的 spring 配置中:
    【解决方案2】:

    更新的答案。基于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 中有数据源引用(我没有在Spring 中测试它为我手头没有 Spring 样品):

    <jee:jndi-lookup
        id="aDataSource" 
        jndi-name="java:app/env/jdbc/b" 
        cache="true" 
        expected-type="javax.sql.DataSource"/>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-05-10
      • 1970-01-01
      • 1970-01-01
      • 2013-02-02
      • 2014-05-08
      • 2018-05-16
      • 2013-04-09
      • 1970-01-01
      相关资源
      最近更新 更多