2015-11-05 208 views
2

我確實有一個EJB ActionService,我可以將其注入到其他EJB中,這可以正常工作。EJB無法注入其他EJB

現在我創造了另一個EJB:

@Stateless 
public class ActionsPerDateDataSet extends ScriptedDataSetEventAdapter {  
    @EJB 
    ActionService actionService; 

@Override 
public void open(IDataSetInstance dataSet) { 
     actionService.foo() // However actionService is null here! 
    } 
} 

ScriptedDataSetEventAdapter來自另一個框架(BIRT)。 但是現在我的actionService總是null。我不明白爲什麼

+0

你究竟是怎麼注入'ActionsPerDateDataset'本身的?通過'@ EJB'吧?還是你手動實例化它(或讓BRIT手動實例化它)?無論如何,你究竟在哪裏試圖訪問'actionService'?也許在構造函數中? – BalusC

+0

而應用服務器是? – George

+0

Glassfish v3.1。 Birt正在實例化它 – matthias

回答

0
  1. 你嘗試使用CDI?我認爲這值得一試。您需要在meta-inf文件夾中放置一個空的beans.xml,並將@EJB更改爲@Inject。但是唯一的辦法就是如果你在同一個部署單元中有外部庫和war/jar文件。

  2. 如果不工作,你將需要使用JNDI用於查找你的bean: http://docs.oracle.com/javaee/6/tutorial/doc/gipjf.html

0

這可能是類ScriptedDataSetEventAdapter 不能在EJB容器進行初始化(第一部分週期) 並且由於初始化不正確,不會進行依賴注入(@EJB和@Inject)。

你可以做的是改變你的EJB的設計,而是擴展「ScriptedDataSetEventAdapter」 將它改爲組合。

@Stateless 
public class ActionsPerDateDataSet {  

    ScriptedDataSetEventAdapter scriptedDataSetEventAdapter; 

    @EJB 
    ActionService actionService; 

    @PostConstruct 
    public void init(){ 
     try { 
      scriptedDataSetEventAdapter = new ScriptedDataSetEventAdapter(); 
     } catch(AppException e){ 
     } 
    } 

@Override 
public void open(IDataSetInstance dataSet) { 
     actionService.foo() // However actionService is null here! 
    } 
} 
1

您應該引入的lib作爲EAR文件的ejbModule,使容器搜索jar文件並進行部署,並注入它時,它需要

1

ActionService具有與@local註釋如果此接口是一個類,它必須有註釋@LocalBean。

(這能夠在運行時訪問它的實例)

如果它是一個接口,如果它有多個實現你將不得不引用您需要使用@EJB實施(beanName =「 nameOfImplementation「)的情況下,它是其中@LocalBean用於使用@EJB(名稱=一類‘nameEjb’)

接口與@Local 類具有@LocalBean

在凝集類 接口與多個實現@EJB(beanName =「nameOfImplementation 「) 類@EJB(name =」 nameEjb「)

注:實現了ActionService與@Local和測試 注接口:添加跟蹤控制檯日誌知道如果類被初始化爲EJB:ActionService