2015-11-05 96 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