5

Mam fasolę @Stateless, która implementuje dwa interfejsy (zdalny i lokalny). Dodałem także anotację do uzyskiwania dostępu do komponentu bean w widoku bez interfejsu.WELD-001408 Niezadowolone zależności podczas wstrzykiwania EntityManager

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

    public WeatherDataBean() { 

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

używam @Inject tego powodu podjętej 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.

Teraz wcześniej użyłem:

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

W EJB i działa bez problemu. Ale z @Inject adnotacji otrzymuję ten błąd:

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

Oto jak ja Resources klasy zdefiniowane:

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

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

Dlaczego jest to, że ten błąd, gdy próbuję wprowadzić kierownik jednostki?

EDIT: Na wniosek @LightGuard dodaję pakiety, które używam odwołać adnotacji:

  1. WeatherDataBean posiada:

    import javax.ejb.LocalBean; 
    import javax.ejb.Stateless; 
    import javax.inject.Inject; 
    
  2. Zasoby ma :

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

Wszystko wygląda poprawnie. Czy na pewno masz poprawne adnotacje (pakiety kontrolne)? Może również zależeć od tego, jak pakujesz rzeczy. – LightGuard

+0

Proszę sprawdzić moją odpowiedź Dodałem, które pakiety używam dla tych adnotacji. Używam projektu EAR do spakowania projektu EJB, projektu EJBClient, projektu JPA i projektu JSF. –

+0

Ah, okay, jeśli używasz rzeczy EAR trochę się zmienia. Będziesz musiał umieścić miejsce, w którym robisz zastrzyk, w której bibliotece znajdują się klasy i gdzie znajdują się pliki beans.xml. – LightGuard

Odpowiedz

5

prostu miałem ten sam problem, naprawiłem to przez dodanie tej klasy do mojego projektu

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

ja wpadłem na podobny problem, okazało się, że nie umieścić fasoli. xml w folderze WEB-INF. Plik beans.xml może być pustym plikiem umieszczonym w folderze WEB-INF. JBossAS sprawdza ten plik, aby uruchomić usługę CDI.

Powiązane problemy