【问题标题】:EAR cannot find EJBs in other EAR (WAS shared lib issue)EAR 在其他 EAR 中找不到 EJB(WAS 共享库问题)
【发布时间】:2013-05-02 19:09:40
【问题描述】:

我在我的实体层-EAR 中设置了一个 EJB:

    <session>
        <ejb-name>DoctorDaoImpl</ejb-name>
        <business-local>mypath.DoctorDao</business-local>
        <ejb-class>mypath.DoctorDaoImpl</ejb-class>
        <session-type>Stateless</session-type>
    </session>

根据日志,EAR 及其 EJB 启动良好。我在共享库中有外观(例如 DoctorDao),实体层 EAR 具有实现(例如 DoctorDaoImpl)。

现在,当我部署我的 Doctor 服务时,它有一个 data-service.jar,它的 DoctorDataEjb 注入了 DoctorDao。

但我收到一条错误消息:

无法解析 Doctor 应用程序的 data-service.jar 模块中 DoctorDataEjb 组件中的 mypath.DoctorDao EJB 引用。嵌套异常是:com.ibm.ejs.container.EJBNotFoundException: EJB with interface mypath.DoctorDao not present in application Doctor

现在,我意识到,Doctor 应用程序中确实不存在 EJB。它存在于实体层 EAR 中。我见过类似的link,所以我想我必须找出正确的绑定名称才能输入“EJB 引用”WAS Admin UI(或者我可以在 ibm-ejb-jar- bnd.xml)。

如果我查看生成的 ejb-jar_merged.xml,我会看到 ref 是这样定义的:

<ejb-ref>
     <ejb-ref-name>mypath.DoctorDao</ejb-ref-name>
     <remote>mypath.DoctorDao</remote>
     <injection-target>
        <injection-target-class>mypath.DoctorDataEjb</injection-target-class>
        <injection-target-name>doctorDao</injection-target-name>
     </injection-target>
</ejb-ref>

我尝试将目标资源 JNDI 名称设置为: java:global/MyEntityLayerApp/entity-service/DoctorDaoImpl!myPath.DoctorDao 现在得到: java.lang.IllegalArgumentException:无法将 myPath.DoctorDao 字段 myPath.DoctorDataEjb.doctorDao 设置为 myPath.EJSLocal0SLDoctorDaoImpl_

zoiks。关于“本地”的一些东西。

【问题讨论】:

    标签: ejb websphere ejb-3.0 jndi ear


    【解决方案1】:

    看起来你正在定义一个本地 ejb 接口:

     <ejb-name>DoctorDaoImpl</ejb-name>
        <business-local>mypath.DoctorDao</business-local>
    

    然后你尝试将它作为远程引用:

    <ejb-ref>
     <ejb-ref-name>mypath.DoctorDao</ejb-ref-name>
     <remote>mypath.DoctorDao</remote>
    

    这行不通。您必须决定哪个适合您的业务案例:)

    【讨论】:

    • 谢谢马科斯,真是太棒了。接口 Dao 有方法,是 Local,然后 DaoRemote(扩展 Dao)是空的,Remote,然后我们所有的 EJB 扩展 DaoRemote。所以我以为DoctorDao会继承Remote,但我猜它实际上是Local。但是我粘贴的ejb-jar_merged是WAS生成的。所以很明显DoctorDao是本地的。让我看看更改此设置(使用一个本地和一个远程扩展的通用基础 Dao)是否有帮助。
    • 还是不行,所以我们试试直接引用named ejbs。我认为如果可以的话,我们将回避整个 EJB-in-another-EAR 业务。只需将实体层切割成每个 EAR 的一个 EJB。
    • 好的,所以我能够让它工作的唯一方法是在 WAS UI 中命名 EJB,然后在 UI 中为其他服务映射到该名称。似乎很古老。好像没有别的办法了。如果我错了纠正我。所以我们将不得不重构一切:/
    • 这是 ejb 3 吗?你是在本地还是远程实现的?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-21
    • 1970-01-01
    • 1970-01-01
    • 2011-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多