对于没有接口视图的bean,@ EJB Injection在单例中失败

时间:2016-08-04 23:34:50

标签: java-ee singleton ejb

我有一个没有接口视图的无状态DAO-EJB,它继承自通用抽象DAO类,附加方法readAll();所以树是FooDAOBean <- extends GenericDAOImpl <- implements GenericDAOInterfaceclick here to see GenericDAO implementation - 在链接中它不是一个抽象类):

@Stateless
public class FooDAOBean extends GenericDAOImpl<ENodeFocus, Serializable>{

    @Override   
    public List<Foo> readAll() {
        // do something...
    }
}

我有一个初始化bean,它应该为应用程序配置一些条目:

@Singleton
@Startup
public class InitializationBean {

    @EJB
    FooDAOBean dao;

    @PostConstruct
    public void initialize() {
      // do something
    }
}

在部署时我遇到了错误:

  

WFLYNAM0059:注入资源查找失败:   ENV / shitstorm.beans.InitializationBean / DAO

     

WFLYEE0046:无法实例化组件视图

当我实现远程接口并使用FooDAOBean注释@Remote(<RemoteInterface>.class)时,它正常工作。但我不想允许远程访问。对我来说重要的是,FooDAOBean的方法只能在同一个JVM(本地)中访问。 FooDAOBeanInitializationBean属于同一个EAR项目,所以它应该可以工作还是我会错过这里的内容?是否与单身人士或这里发生的事情有什么关系?我必须实现本地接口吗?我认为自EJB 3.0以来我不再需要它了。非常感谢! :)

1 个答案:

答案 0 :(得分:1)

请注意,您的FooDAOBean正在通过其超类实现业务接口。

Oracle Java EE教程声明:

  

如果bean类实现了单个接口,那么该接口就是   假设到业务接口。业务接口是本地的   接口除非使用javax.ejb.Remote注释进行注释;   在这种情况下,javax.ejb.Local注释是可选的。

因此,您的FooDAOBean实际上有一个本地接口视图,而不是您期望的无接口视图。

我建议将你的Bean重命名为FooDAOBeanImpl。然后创建一个继承自FooDAOBean的接口GenericDAOInterface。让你的会话Bean FooDAOBeanImpl现在改变新界面并使用@Local(FooDAOBean.class)注释该类以获得明确定义的@Local界面视图。现在,您可以按预期注入FooDAOBean