5

我有@Stateless bean,它实现两个接口(远程和本地)。我还添加了@LocalBean anotation来访问具有无界面视图的bean。WELD-001408注入EntityManager时不满意的依赖关系

@Stateless 
@LocalBean 
public class WeatherDataBean implements WeatherDataBeanRemote, WeatherDataBeanLocal { 
    @Inject 
    private EntityManager entityManager; 

    public WeatherDataBean() { 

    } 
    // ....attributes, getter & setter methods .... 
} 

我用@Inject为此采取from this example of JBoss AS7 quickstart

We use the "resource producer" pattern, from CDI, to "alias" the old fashioned @PersistenceContext injection of the entity manager to a CDI style injection. This allows us to use a consistent injection style (@Inject) throughout the application.

现在以前我用:

@PersistenceContext(unitName="WeatherStationJPA") 
private EntityManager entityManager; 

在EJB和它的作品没有任何问题。但随着@Inject注解我得到这个错误:

WELD-001408 Unsatisfied dependencies for type [EntityManager] with qualifiers [@Default] at injection point [[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我加入,我使用引用注释包要求:

  1. WeatherDataBean有:

    import javax.ejb.LocalBean; 
    import javax.ejb.Stateless; 
    import javax.inject.Inject; 
    
  2. 资源有:

    import javax.enterprise.inject.Produces; 
    import javax.faces.context.FacesContext; 
    import javax.inject.Singleton; 
    import javax.persistence.EntityManager; 
    import javax.persistence.PersistenceContext; 
    
+0

一切都看起来正确。你确定你有正确的注释(检查包)吗?也可能取决于你如何包装东西。 – LightGuard 2012-08-01 17:56:31

+0

请检查我的答案我已经添加了哪些软件包用于这些注释。我正在使用EAR项目来打包EJB项目,EJBClient项目,JPA项目和JSF项目。 – 2012-08-01 18:06:40

+0

啊,好的,如果你使用的是EAR,东西会改变一点。您必须放置您正在进行注入的位置,类所在的库以及beans.xml文件所在的位置。 – LightGuard 2012-08-04 07:12:21

回答

5

我有同样的问题,我加入这个类来我的项目

import java.util.logging.Logger; 

import javax.enterprise.context.RequestScoped; 
import javax.enterprise.inject.Produces; 
import javax.enterprise.inject.spi.InjectionPoint; 
import javax.faces.context.FacesContext; 
import javax.persistence.EntityManager; 
import javax.persistence.PersistenceContext; 

/** 
* This class uses CDI to alias Java EE resources, such as the persistence context, to CDI beans 
* 
* <p> 
* Example injection on a managed bean field: 
* </p> 
* 
* <pre> 
* &#064;Inject 
* private EntityManager em; 
* </pre> 
*/ 
public class Resources { 
    // use @SuppressWarnings to tell IDE to ignore warnings about field not being referenced directly 
    @SuppressWarnings("unused") 
    @Produces 
    @PersistenceContext 
    private EntityManager em; 

    // @Produces 
    // public Logger produceLog(InjectionPoint injectionPoint) { 
    // return Logger.getLogger(injectionPoint.getMember().getDeclaringClass().getName()); 
    // } 

    @Produces 
    @RequestScoped 
    public FacesContext produceFacesContext() { 
     return FacesContext.getCurrentInstance(); 
    } 

} 
6

我也碰到了类似的错误修正了这个,原来我没放豆子。 xml文件在WEB-INF文件夹中。 beans.xml文件可以是一个位于WEB-INF文件夹中的空文件。 JBossAS检查该文件以启动CDI服务。

相关问题