Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java EJB不能注入其他EJB_Java_Jakarta Ee_Ejb - Fatal编程技术网

Java EJB不能注入其他EJB

Java EJB不能注入其他EJB,java,jakarta-ee,ejb,Java,Jakarta Ee,Ejb,我确实有一个EJBActionService,我可以将它注入到其他EJB中,这很好 现在我创建了另一个EJB: @Stateless public class ActionsPerDateDataSet extends ScriptedDataSetEventAdapter { @EJB ActionService actionService; @Override public void open(IDataSetInstance dataSet) {

我确实有一个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
。我不明白为什么

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

  • 如果这不起作用,您将需要使用JNDI来查找bean:


  • 类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!
        }
    }
    

    您应该将lib作为ejbModule引入ear文件,以便容器搜索jar文件,并在需要时部署和注入它。ActionService有一个与@local注释的接口,或者如果这是一个类,它必须有@LocalBean注释

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

    如果它是一个接口,并且有多个实现,则必须使用@EJB(beanName=“nameOfImplementation”)引用所需的实现,如果它是一个类,其中@LocalBean用于使用@EJB(name=“nameEjb”)

    与@Local接口 使用@LocalBean初始化

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

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

    您是如何注入
    ActionsPerDateDataset
    本身的?通过
    @EJB
    对吗?或者你手动实例化了它(或者让BRIT手动实例化)?不管怎样,您试图访问
    actionService
    的确切位置是什么?在构造函数中,应用服务器是Glassfish v3.1。Birt正在实例化它,所以您认为手动执行
    新建ActionsPerDateDataSet()
    会神奇地设置所有字段,并在其上添加依赖项注入注释?那个手工构建的实例根本不是EJB。只有通过
    @EJB
    获得它时,它才是真正的EJB。所以,基本上您是在尝试将EJB注入一个普通的旧Java对象中?在本例中,它只是EJB端的POJO。