EJB无法注入其他EJB

3

我有一个名为ActionService的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。我不明白为什么。


你是怎么注入 ActionsPerDateDataset 的呢?是通过 @EJB 吗?还是你手动实例化了它(或让BRIT手动实例化)?无论如何,你在哪里尝试访问 actionService ? 是在构造函数中吗? - BalusC
应用服务器是什么? - George
Glassfish v3.1。Birt正在实例化它。 - matthias
4
那么你期望手动执行new ActionsPerDateDataSet()会自动设置所有带有依赖注入标注的字段吗?这个手工创建的实例根本不是EJB。只有通过@EJB获取它时,它才是真正的EJB。所以基本上你试图在一个普通的Java对象中注入一个EJB。 - BalusC
1
如果对象是由另一个框架实例化的,那么EJB容器如何管理它?在这种情况下,它只是来自EJB方面的POJO。 - dmitrievanthony
ActionService是否包含无参数的构造函数?ActionService是EJB的bean还是接口? - Riadh
4个回答

1

可能在 EJB 容器中无法初始化 ScriptedDataSetEventAdapter 类(循环的第一部分),由于初始化不正确,因此未进行依赖注入(@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
你应该将库作为ejbModule引入ear文件中,这样容器就会搜索该jar文件并在需要时进行部署和注入。

1

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

(这样才能在运行时访问它的实例)

如果它是一个接口并且有多个实现,则您将需要使用@EJB(beanName =“nameOfImplementation”)引用所需的实现;如果它是一个使用@LocalBean的类,则使用@EJB(name =“nameEjb”)。

带@Local的接口 带@LocalBean的类

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

注意:使用@Local实现ActionService接口并进行测试 注意:添加跟踪控制台日志以了解类是否作为ejb:ActionService初始化


0
  1. 你尝试使用CDI了吗?我认为这是值得一试的。你需要在meta-inf文件夹中放置一个空的beans.xml文件,并将@EJB更改为@Inject。但是,这只有在您的外部库和war/jar文件在同一部署单元中时才能起作用。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接