5

Ich habe @Stateless Bohne, die zwei Schnittstellen (remote und lokal) implementiert. Ich habe auch @LocalBean eine Anotion für den Zugriff auf Bean mit einer No-Interface-Ansicht hinzugefügt.WELD-001408 Unzufriedene Abhängigkeiten beim Injizieren von EntityManager

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

    public WeatherDataBean() { 

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

Ich benutze @Inject aus diesem Grunde from this example of JBoss AS7 quickstart genommen:

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.

Jetzt vorher habe ich verwendet:

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

In EJB und es funktioniert ohne Probleme. Aber mit @Inject Anmerkung bekomme ich diesen Fehler:

WELD-001408 Unsatisfied dependencies for type [EntityManager] with qualifiers [@Default] at injection point [[field] @Inject private ejb.WeatherDataBean.entityManager]

Hier ist, wie ich Klasse Ressourcen definiert:

public class Resources { 
    @SuppressWarnings("unused") 
    @PersistenceContext(unitName="WeatherStationJPA") 
    @Produces 
    private EntityManager entityManager; 

    @Produces 
    FacesContext getFacesContext() { 
     return FacesContext.getCurrentInstance(); 
    } 
} 

Warum ist, dass ich diesen Fehler, wenn ich versuche, Entity-Manager zu injizieren?

EDIT: Auf Anfrage von @LightGuard ich Pakete bin hinzufügen, die ich Anmerkungen verweisen bin mit:

  1. WeatherDataBean hat:

    import javax.ejb.LocalBean; 
    import javax.ejb.Stateless; 
    import javax.inject.Inject; 
    
  2. Ressourcen hat :

+0

Alles sieht korrekt aus. Sind Sie sicher, dass Sie die richtigen Anmerkungen haben (Pakete überprüfen)? Kann auch davon abhängen, wie Sie Dinge verpacken. – LightGuard

+0

Bitte überprüfen Sie meine Antwort Ich habe hinzugefügt, welche Pakete ich für diese Anmerkungen verwende. Ich benutze EAR-Projekt, um EJB-Projekt, EJBClient-Projekt, JPA-Projekt und JSF-Projekt zu verpacken. –

+0

Ah, okay, wenn du ein EAR verwendest, ändern sich die Dinge ein bisschen. Sie müssen angeben, wo Sie die Injektion durchführen, in welcher Bibliothek sich die Klassen befinden und wo sich Ihre beans.xml-Dateien befinden. – LightGuard

Antwort

5

Ich hatte gerade das gleiche Problem, ich dies, indem diese Klasse zu meinem Projekt festen

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

Ich habe lief in einen ähnlichen Fehler, stellte sich heraus, dass ich nicht ein Bohnen gelegt hat. XML-Datei im Ordner WEB-INF. Die Datei beans.xml kann eine leere Datei im WEB-INF-Ordner sein. JBossAS überprüft diese Datei, um den CDI-Dienst zu starten.