Java 焊接生产商

Java 焊接生产商,java,jboss,cdi,weld,Java,Jboss,Cdi,Weld,我试图将war部署到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 ser

我试图将war部署到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无法找到合适的bean进行注射造成的。但是,我为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;
}

在另一个项目中,完全相同的设置工作得很好。有什么想法吗?

只是一个遥远的目标,但是有两种类型的注释:
javax.faces.bean.ApplicationScoped
javax.enterprise.context.ApplicationScoped
。我猜您的生产者是用JSF注释而不是CDI注释的

正如CDI规范所说:

1.2.6。与JSFJavaServerFaces的关系是一个web层表示框架,它为图形用户界面提供了一个组件模型 组件和绑定用户的事件驱动交互模型 接口组件到可通过统一EL访问的对象。这 规范允许为任何bean分配一个统一的EL名称。 因此,JSF应用程序可以利用本文定义的复杂上下文和依赖注入模型 规格。

这意味着您可以自由地将cdibean注入到JSF管理的bean中,但事实并非如此。容器中的东西`


如果你想使用CDI,你必须改变你的注释来自
javax.enterprise.context
包。

在上面的评论中回答的问题是:@products注释是从错误的包导入的。谢谢你,安托万·斯博特·杜兰德

谢谢你的提示。恐怕我的应用程序中的@xScoped注释都是从javax.enterprise.content包中导入的,所以这不是问题所在。您在同一个模块中有两个类吗?并且您确定您的
@products
不是
javax.ws.rs.products
?啊哈!这就是问题所在。非常感谢。