EJB无法注入其他EJB

时间:2015-11-05 13:01:32

标签: java java-ee ejb

我确实有一个EJB ActionService,我可以将其注入到其他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。我无法理解为什么

4 个答案:

答案 0 :(得分:1)

您应该在ear文件中引入lib作为ejbModule,以便容器搜索jar文件并进行部署并在需要时将其注入

答案 1 :(得分:1)

ActionService有一个带@local注释的接口,或者如果这是一个类,它必须有注释@LocalBean。

(这是为了能够在运行时访问它的实例)

如果它是一个接口,并且它有多个实现,你必须使用@EJB(beanName =“nameOfImplementation”)引用你需要的实现,以防它是一个使用@LocalBean来使用@EJB的类( name =“nameEjb”)

与@Local的接口 带@LocalBean的类

在聚合类中 与多个实现的接口@EJB(beanName =“nameOfImplementation”) 类@EJB(name =“nameEjb”)

注意:使用@Local和test实现ActionService的接口 注意:添加跟踪控制台日志以了解该类是否正在初始化为ejb:ActionService

答案 2 :(得分:0)

  1. 您尝试过使用CDI吗?我觉得值得一试。您需要在meta-inf文件夹中放置一个空的beans.xml,并将@EJB更改为@Inject。但唯一可行的方法是,如果您在同一部署单元中拥有外部lib和war / jar文件。

  2. 如果这不起作用,您将需要使用JNDI来查找您的bean: http://docs.oracle.com/javaee/6/tutorial/doc/gipjf.html

答案 3 :(得分: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!
    }
}