2015-06-04 35 views
0

我在嘗試專門化EJB。我有@Specializes for EJB

package com.foo.core; 
@Stateless 
public class MyFacade { } 

package com.foo.extension;  
@Specializes 
@Stateless 
public class MyFacade extends com.foo.core.MyFacade { } 

在我看來,這應該工作,因爲@Specializes的意思是,CDI應該忘記的核心類,而是使用專門的類。我還發現這個錯誤https://issues.jboss.org/browse/WELD-1451,它指出可以專門化一個EJB。

但如果我嘗試部署我的應用程序(我使用的Weblogic 12.1.3),我總是得到

weblogic.utils.ErrorCollectionException:有1個嵌套的錯誤: weblogic.j2ee.dd .xml.AnnotationProcessException:複製EJB名稱 'MyFacade' 發現:標註 '無狀態' 的bean類 com.foo.core.MyFacade和annoation '無狀態' 的bean類 com.foo.extension.MyFacade

我做錯了什麼?

謝謝!

+0

CDI規範沒有定義EJB規範的工作方式。儘管您提到的缺陷已得到解決,但與其關聯的拉取請求已被拒絕,所以我不確定是否有實際的解決方案。如果你想專精,我會推薦使用純CDI豆。 –

+0

我曾考慮將我的EJB更改爲純CDI bean。但我需要聲明式事務控制。我可以@Transactional,但這是JEE7的一部分,因此在Weblogic 12.1.3中不可用。 – Ben

+0

正如JohnAment所說,@Specializes是一個CDI特性及其規範,並沒有定義如何使用EJB。 我使用weblogic,我建議你,如果你等待這種情況,請修復weblogic,這可能需要很長時間。 因此,試着找到另一種只使用CDI規範的方法。 –

回答

1

引用的異常消息是由名稱衝突引起的,該名稱衝突根本不直接與CDI相關:每個EJB都可以由多個不同的JNDI名稱尋址,其中一些名稱(例如java:module/MyFacade)僅包含簡單的類名稱,而不是包名稱。所以你不能在不同的包中有兩個具有相同名稱的EJB。

添加CDI和@Specializes可能會阻止專用EJB顯示在CDI容器中,但它仍然是一個EJB。

你可以嘗試重命名你的派生類 - 這應該解決重名問題,但我不確定它會解決你的整體問題。