我确实有一个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
。我无法理解为什么
答案 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)
您尝试过使用CDI吗?我觉得值得一试。您需要在meta-inf文件夹中放置一个空的beans.xml,并将@EJB更改为@Inject。但唯一可行的方法是,如果您在同一部署单元中拥有外部lib和war / jar文件。
如果这不起作用,您将需要使用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!
}
}