2013-05-08 69 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

相關問題