2013-05-08 44 views
0

我有一个EJB在我的实体层-EAR设置:EAR找不到另一只耳朵的EJB(WAS的共享库的问题)

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

根据日志,耳朵和EJB的开始很好。我有共享库中的Facade(例如DoctorDao),实体层EAR具有实现(例如DoctorDaoImpl)。

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

,但我得到一个错误说:

在医生应用程序的数据service.jar中模块中的组件DoctorDataEjb的mypath.DoctorDao EJB引用无法解析。嵌套的异常是:com.ibm.ejs.container.EJBNotFoundException:具有接口mypath.DoctorDao的EJB在应用程序中不存在

现在,我意识到EJB确实不存在于Doctor应用程序中。它存在于实体层EAR中。我见过这个link,这是相似的,所以我想我必须制定出正确的绑定名称来输入“EJB引用”WAS管理界面(或者我可以在ibm-ejb-jar-bnd中设置它。 XML)。

如果我查看生成的ejb-jar_merged.xml,我看到裁判如此定义:

<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:全球/ MyEntityLayerApp /实体 - !服务/ DoctorDaoImpl myPath.DoctorDao 现在得到: java.lang.IllegalArgumentException异常:无法设置myPath.DoctorDao场myPath.DoctorDataEjb.doctorDao到myPath.EJSLocal0SLDoctorDaoImpl_

zoiks。关于'本地'的东西。

回答

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> 

它不会工作。你将不得不决定哪个适合你的商业案例:)

+0

感谢马科斯,真是个蠢人。接口Dao具有方法并且是Local,那么DaoRemote(扩展Dao)是空的并且是Remote,然后我们所有的EJB都扩展DaoRemote。所以我认为DoctorDao会继承Remote,但我想它实际上是Local。但是我粘贴的ejb-jar_merged是由WAS生成的。所以很明显DoctorDao是本地的东西。让我看看是否改变这个(对于一个本地和一个远程扩展的共同基地道)是有帮助的。 – djb 2013-05-09 08:20:20

+0

它仍然不起作用,所以我们将尝试直接引用命名的ejbs。我认为如果可以的话,我们只是要回避这个整体的EJB-in-another-EAR业务。每个EAR只需将实体层切割成一个EJB。 – djb 2013-05-09 09:24:01

+0

好的,所以我能够实现它的唯一方法就是在WAS UI中命名EJB,然后在UI中映射到其他服务的名称。看起来很古老。似乎没有其他办法。如我错了请纠正我。所以我们将不得不重构一切:/ – djb 2013-05-09 13:19:01