我有一个没有接口视图的无状态DAO-EJB,它继承自通用抽象DAO类,附加方法readAll();
所以树是FooDAOBean <- extends GenericDAOImpl <- implements GenericDAOInterface
(click 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(本地)中访问。 FooDAOBean
和InitializationBean
属于同一个EAR项目,所以它应该可以工作还是我会错过这里的内容?是否与单身人士或这里发生的事情有什么关系?我必须实现本地接口吗?我认为自EJB 3.0以来我不再需要它了。非常感谢! :)
答案 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
。