我正在尝试将战争部署到JBoss AS 7.1.1服务器中,并且在尝试注入EntityManager时部署失败:
17:44:48,037 ERROR [org.jboss.msc.service.fail] (MSC service thread 1-4) MSC00001: Failed to start service jboss.deployment.unit."c3e.war".WeldService: org.jboss.msc.service.StartException in service jboss.deployment.unit."c3e.war".WeldService: org.jboss.weld.exceptions.DeploymentException: Exception List with 1 exception:
Exception 0 :
org.jboss.weld.exceptions.DeploymentException: WELD-001408 Unsatisfied dependencies for type [EntityManager] with qualifiers [@Default] at injection point [[field] @Inject xyz.beans.UploadImpl.em]
at org.jboss.weld.bootstrap.Validator.validateInjectionPoint(Validator.java:275)
at org.jboss.weld.bootstrap.Validator.validateInjectionPoint(Validator.java:244)
at org.jboss.weld.bootstrap.Validator.validateBean(Validator.java:107)
at org.jboss.weld.bootstrap.Validator.validateRIBean(Validator.java:127)
at org.jboss.weld.bootstrap.Validator.validateBeans(Validator.java:346)
at org.jboss.weld.bootstrap.Validator.validateDeployment(Validator.java:331)
at org.jboss.weld.bootstrap.WeldBootstrap.validateBeans(WeldBootstrap.java:366)
at org.jboss.as.weld.WeldContainer.start(WeldContainer.java:83)
at org.jboss.as.weld.services.WeldService.start(WeldService.java:76)
at org.jboss.msc.service.ServiceControllerImpl$StartTask.startService(ServiceControllerImpl.java:1811)
at org.jboss.msc.service.ServiceControllerImpl$StartTask.run(ServiceControllerImpl.java:1746)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:724)
通常情况下,我认为这可能是因为Weld无法找到合适的豆子进行注射。但是,我为EntityManager定义了一个生产者:
@ApplicationScoped
public class Resources {
@PersistenceContext(unitName="myUnit", type=PersistenceContextType.EXTENDED)
private EntityManager entityManager;
@Produces
public EntityManager getEntityManager() {
return entityManager;
}
}
它抱怨的注射点如下:
@RequestScoped
@Named("upload")
public class UploadImpl implements Upload, Serializable {
private static final long serialVersionUID = 1L;
@Inject
EntityManager em;
}
在另一个项目中,完全相同的设置工作正常。有什么想法吗?
答案 0 :(得分:2)
上述评论中回答的问题:@Produces注释是从错误的包中导入的。谢谢你,Antoine Sabot-Durand!
答案 1 :(得分:0)
只是一个长镜头,但有两种类型的注释:javax.faces.bean.ApplicationScoped
和javax.enterprise.context.ApplicationScoped
。我的猜测是你的制作人用JSF注释而不是CDI注释注释。
正如CDI规范所说:
1.2.6。与JSF的关系JavaServer Faces是一个Web层表示框架,为图形用户界面提供组件模型 组件和绑定用户的事件驱动的交互模型 接口组件到可通过Unified EL访问的对象。这个 规范允许为任何bean分配统一的EL名称。 因此,JSF应用程序可以利用由此定义的复杂上下文和依赖注入模型 说明书强>
这意味着您可以自由地将CDI bean注入JSF托管bean,但事实恰恰相反。容器的东西是`
如果您想使用CDI,则必须将注释添加到javax.enterprise.context
包中。