2012-10-24 32 views
0

我使用Maven框架來構建我的項目,EJB 3.0是EJB規範。我有一個實現A.一個EJB接口A和它的相應的EJB類B,如下所示B類的主體:如何在非EJB類中實例化EJB對象?

@Stateless 
@TransactionAttribute(value = TransactionAttributeType.REQUIRES_NEW) 
class B implements A{ 

     @PersistenceContext(unitName = "Draco-PU", type = PersistenceContextType.TRANSACTION) 
    EntityManager entityManager; 

     //called post construct 
     @PostConstruct 
     public init(){ 

      //body of init method 

     } 

我有在不同的包的非EJB類在同一項目中。我想在這個類中實例化類B,以便自動引用init()方法和其他註釋,並且可以顯式調用EJB類中的其他方法。請幫忙。

回答

1

你不能那樣做。 NonEJBClass.someMethod()的調用者需要將A傳遞給someMethod(因爲調用者注入或查找它),或者SomeMethod需要自己執行查找(可能在其中一個「java:」名稱空間中)。否則,你需要改變你的bean,以便它可以通過非託管客戶端可以使用,例如:

豆:

@Stateless 
@TransactionAttribute(value = TransactionAttributeType.REQUIRES_NEW) 
class B implements A { 
    private EntityManager entityManager; 

    @PersistenceContext(unitName = "Draco-PU", type = PersistenceContextType.TRANSACTION) 
    public void setEntityManager(EntityManager em) { 
     entityManager = em; 
    } 

    @PostConstruct 
    public init() { 
     //body of init method 
    } 
} 

不受管理的客戶端:

B obj = new B(); 
obj.setEntityManager(...); 
obj.init(); 

所以,你要麼允許容器來創建對象(並且它負責所有的注入和初始化),或者你自己創建對象(然後你負責所有的setter調用和初始化)。

+0

是不是可以在非EJB類中進行查找? – San

+0

你可以這樣做,但是你在EJB自己的'java:comp'(託管的)及其調用者'java:comp'(servlet?)中執行查找時處於尷尬的位置。我認爲這太混亂了。 –

+0

對不起,我誤讀:是的,非EJB類可以查找EJB。例如,如果總是從servlet調用非EJB類,則可以在servlet中聲明EJB引用,然後非EJB類可以從'java:comp'中查找EJB引用。 –