我有一个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。关于'本地'的东西。
感谢马科斯,真是个蠢人。接口Dao具有方法并且是Local,那么DaoRemote(扩展Dao)是空的并且是Remote,然后我们所有的EJB都扩展DaoRemote。所以我认为DoctorDao会继承Remote,但我想它实际上是Local。但是我粘贴的ejb-jar_merged是由WAS生成的。所以很明显DoctorDao是本地的东西。让我看看是否改变这个(对于一个本地和一个远程扩展的共同基地道)是有帮助的。 – djb 2013-05-09 08:20:20
它仍然不起作用,所以我们将尝试直接引用命名的ejbs。我认为如果可以的话,我们只是要回避这个整体的EJB-in-another-EAR业务。每个EAR只需将实体层切割成一个EJB。 – djb 2013-05-09 09:24:01
好的,所以我能够实现它的唯一方法就是在WAS UI中命名EJB,然后在UI中映射到其他服务的名称。看起来很古老。似乎没有其他办法。如我错了请纠正我。所以我们将不得不重构一切:/ – djb 2013-05-09 13:19:01