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服務。

相關問題