2012-11-06 72 views
6

我知道使用@EJB註釋注入只能在EJB類,servlet或JSF託管bean中注入,但同時我需要注入一些注入的實例在一個POJO類業務接口,所以我想執行以下操作:在POJO中使用EJB注入

在我的JSF

託管bean

@EJB BusinessInterfaceLocal businessInterface; 

private void someMethod(){ 
    PojoInterface pojo = new PojoClass(this.businessInterface); 
} 

,並在我的POJO類我有這樣的構造

BusinessInterfaceLocal businessInterface;  

public PojoClass(BusinessInterfaceLocal businessInterface){ 
    this.businessInterface = businessInterface; 

    //The following throws a Null Pointer Exception 
    this.businessInterface.someMethodCall(); 
} 

不應該該上面工作正常嗎?但它不會,PojoClass上的businessInterface對象被評估爲null,從而拋出一個空指針異常。

我一直希望有人能指出我,我做錯了什麼。

在此先感謝。

+2

爲了讓注射正常工作,你需要用類似@Stateless的方法來聲明類,這樣就可以發生注入。你能提供整個班級以便我們看到嗎? – david99world

+0

問題不在業務接口中,因爲我可以在其他地方使用它,而且它確實使用無狀態註釋進行了註釋,並且它實現的接口使用Local註釋,但是當我嘗試在受管Bean外部使用它時,錯誤會增加在普通類 –

+0

哪裏*精確*是拋出'NullPointerException'?它在你說的路線上,還是在堆棧的更深處? –

回答

9

驗證

是否有可能創建PojoClass的EJB被注入之前。我的意思是,你在哪裏調用「someMethod」?它在託管bean的構造函數中嗎?一個變量根本不會失去其參考值。

你說你可以在Managed bean中看到BusinessInterfaceLocalbean不爲null,你可以驗證你在檢查後創建Pojo嗎?

替代方案:

解決方案1 ​​ 可以使用POJO作爲無狀態Bean,我看不出這樣做的任何問題,當然,除非你想外面使用POJO你的EE容器,也就是說,看起來不是這樣。

使POJO無狀態將使您能夠注入EJB。

解決方案2 或JNDI查找,實現如下:

@Stateless(name="myEJB") 
public class MyEJB { 

    public void ejbMethod() { 
    // business logic 
    } 

} 

public class TestEJB { 

    public static void main() { 
    MyEJB ejbRef = (MyEJB) new InitialContext().lookup("java:comp/env/myEJB"); 
    ejbRef.ejbMethod(); 
    } 
} 
1

有了你上面顯示的代碼,一個NullPointerException可以在指定的行拋出的唯一途徑是,如果businessInterface場在託管bean中是null。當從一個對象傳遞給另一個對象時,引用不能神祕地變爲空,並且PojoClass不會做任何會導致該變量爲空的任何事情。我建議你做一些調試或日誌記錄,以確定調用構造函數時託管bean中字段的值。如果它是空的,那麼問題是注入到bean中,與POJO沒有任何關係,你應該修復它。

如果拋出的異常實際上來自比你展示的行更深的地方,那麼這可能是在錯誤的上下文中使用EJB代理的問題。您可能知道,對EJB的引用通常不是對EJB本身的引用,而是對將某些方法調用傳遞給EJB的某種代理的引用;該代理存在,以便容器可以介入並執行啓動事務,檢查授權等等。代理可能需要調用某些上下文資源來完成它的工作,這些資源在從受管Bean訪問EJB時可用,但對於某些非顯而易見且扭曲的原因,則不能從POJO訪問。這些資源的不可用性可能導致NullPointerException。現在,我認爲簡單地將託管bean的引用傳遞給POJO不太可能讓你陷入這種情況;這隻會發生,如果你做了像從不同的線程訪問託管bean的東西。所以,這可能不是這個!

+0

在那個時間點它在託管bean中是否爲null? –

+0

隨着你顯示的代碼,這是不可能發生的。檢查你的假設。 –

+0

如果您可能允許我進一步調查此問題,我會盡快回復您,但我確定您所說的是最合理的 –

0

問題是由我嘗試使用businessInterface對象在構造函數中,而容器注入它的完成實例化管理bean只有在EJB造成的,

參考了類似的問題https://stackoverflow.com/a/6537228/1249304

什麼我做的是我創建了一個方法並使用@PostConstruct註釋對其進行了註釋,這樣在容器完成實例化託管bean之後,已註釋的方法被調用並且businessInterface對象不再爲null

@PostContsruct 
public void onInit(){ 
    //businessInterface is no longer null 
    businessInterface.someMethod(); 
}