【发布时间】:2012-07-31 19:58:33
【问题描述】:
我有@Stateless bean,它实现了两个接口(远程和本地)。我还添加了@LocalBean 注释,用于使用无接口视图访问 bean。
@Stateless
@LocalBean
public class WeatherDataBean implements WeatherDataBeanRemote, WeatherDataBeanLocal {
@Inject
private EntityManager entityManager;
public WeatherDataBean () {
}
// ....attributes, getter & setter methods ....
}
出于这个原因,我使用@Injectfrom this example of JBoss AS7 quickstart:
我们使用来自 CDI 的“资源生产者”模式,将实体管理器的老式 @PersistenceContext 注入“别名”为 CDI 样式注入。这允许我们在整个应用程序中使用一致的注入样式 (@Inject)。
现在我以前用过:
@PersistenceContext(unitName="WeatherStationJPA")
private EntityManager entityManager;
在 EJB 中,它可以正常工作。但是使用@Inject 注释我得到这个错误:
WELD-001408 类型 [EntityManager] 的依赖项不满足 限定符 [@Default] 在注入点 [[field] @Inject private ejb.WeatherDataBean.entityManager]
这是我定义类资源的方式:
public class Resources {
@SuppressWarnings("unused")
@PersistenceContext(unitName="WeatherStationJPA")
@Produces
private EntityManager entityManager;
@Produces
FacesContext getFacesContext() {
return FacesContext.getCurrentInstance();
}
}
如果我尝试注入实体管理器,为什么会出现此错误?
编辑: 应@LightGuard 的请求,我正在添加用于引用注释的包:
-
WeatherDataBean 有:
import javax.ejb.LocalBean; import javax.ejb.Stateless; import javax.inject.Inject; -
资源有:
import javax.enterprise.inject.Produces; import javax.faces.context.FacesContext; import javax.inject.Singleton; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext;
【问题讨论】:
-
一切看起来都正确。你确定你有正确的注释(检查包)吗?也可能取决于你如何包装东西。
-
请检查我的答案我已经添加了我用于这些注释的包。我正在使用EAR项目打包EJB项目、EJBClient项目、JPA项目和JSF项目。
-
啊,好吧,如果您使用的是 EAR,情况会有所改变。您必须将进行注入的位置、类所在的库以及 beans.xml 文件所在的位置放置。
标签: dependency-injection java-ee-6 cdi entitymanager stateless-session-bean