5

Tengo @Stateless bean que implementa dos interfaces (remota y local). También agregué la anotación @LocalBean para acceder al bean con una vista sin interfaz.WELD-001408 Dependencias insatisfechas cuando se inyecta EntityManager

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

    public WeatherDataBean() { 

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

utilizo @Inject por esta razón tomada 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.

Ahora anteriormente he utilizado:

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

En EJB y funciona sin ningún problema. Pero con @Inject anotación consigo este error:

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

Aquí es cómo han definido recursos de clase:

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

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

¿Por qué es que me sale este error si intento de inyectar gestor de la entidad?

EDIT: A petición de @LightGuard Estoy añadiendo paquetes que estoy usando para hacer referencia a las anotaciones:

  1. WeatherDataBean tiene:

    import javax.ejb.LocalBean; 
    import javax.ejb.Stateless; 
    import javax.inject.Inject; 
    
  2. Recursos ha :

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

Todo parece correcto. ¿Estás seguro de que tienes las anotaciones correctas (comprueba los paquetes)? También puede depender de cómo estás empaquetando cosas. – LightGuard

+0

Compruebe mi respuesta He agregado qué paquetes uso para estas anotaciones. Estoy utilizando el proyecto EAR para empaquetar el proyecto EJB, el proyecto EJBClient, el proyecto JPA y el proyecto JSF. –

+0

Ah, está bien si estás usando un EAR, las cosas cambian un poco. Tendrá que ubicar dónde está haciendo la inyección, en qué biblioteca se encuentran las clases y dónde se encuentran sus archivos beans.xml. – LightGuard

Respuesta

5

yo sólo tenía el mismo problema, me fijo esto añadiendo esta clase para mi proyecto

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

he encontré con un error similar, resultó que no puse un frijol. archivo xml en la carpeta WEB-INF. El archivo beans.xml puede ser un archivo vacío que se encuentra en la carpeta WEB-INF. JBossAS verifica ese archivo para iniciar el servicio CDI.

Cuestiones relacionadas