java ee - CDI: WELD-001408 Dependencias insatisfechas, ¿cómo resolverlo?
java-ee glassfish-4 (4)
Hago un pequeño proyecto de prueba con CDI. Mi aplicación se compone de un EJB EAR y WAR, todos implementados en Glassfish 4. Estoy usando Hibernate 4.3.4 para acceder a la base de datos.
Mi objetivo es verificar que una clase en un EJB (DAO) pueda recibir una inyección de un EntityManager.
El patrón SessionBean + EJB no es fantástico, pero tengo que modificar una aplicación ya creada, por lo que no tengo muchas opciones.
Aquí está mi código del EJB:
@Named
public class DAOTest implements Serializable {
private static final long serialVersionUID = 1L;
@PersistenceContext(unitName="CDI-ejb")
private EntityManager em;
public void test(){
//em.getClass();
}
public EntityManager getEm() {
return em;
}
public void setEm(EntityManager em) {
this.em = em;
}
public DAOTest() {
// TODO Auto-generated constructor stub
}
}
Servicio.java
@Stateless
@LocalBean
public class Service implements ServiceLocal {
@Inject DAOTest test;
/**
* Default constructor.
*/
public Service() {
// TODO Auto-generated constructor stub
}
@Override
public void test() {
test.test();
}
}
y ServiceLocal.java
@Local
public interface ServiceLocal {
void test();
}
Y dentro de mi guerra:
@WebServlet("/Test")
public class Test extends HttpServlet {
private static final long serialVersionUID = 1L;
@Inject private ServiceLocal service;
/**
* @see HttpServlet#HttpServlet()
*/
public Test() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
service.test();
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
}
}
Probé el DAOTest anotándolo con la anotación @ Stateless. Todo sucede como debería. Así que CDI funciona bien. Pero con solo @ Nombrado no quiere trabajar.
¿Alguna idea?
El stacktrace:
org.jboss.weld.exceptions.DeploymentException: WELD-001408 Unsatisfied dependencies for type [DAOTest] with qualifiers [@Default] at injection point [[BackedAnnotatedField] @Inject test.Service.test]
Mis beans.xml
<beans xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/beans_1_0.xsd">
</beans>
@LocalBean significa que inyectará el bean y no la interfaz
@Inject Service service
y no
@Inject ServiceLocal service
Dado que este es el primer hit que obtuve buscando WELD-001408, permítanme mencionar también una causa que es la falta de un constructor sin argumentos. Aparentemente, este NO fue el caso del OP, pero fue la causa del problema en mi propio caso, por lo que esto también puede ayudar a otros.
Java EE 7 tiene archivos de bean implícitos de forma predeterminada, es decir, una clase de bean requiere que se descubra una anotación de alcance como bean CDI.
@Named
no es una anotación de alcance. Intente @Dependent
en @Dependent
lugar.
beans.xml
ya no es necesario en CDI 1.1 / Java EE 7. Si tiene uno, entonces la versión exacta y el bean-discovery-mode
marcan la diferencia. Vea la sección de archivos Bean de la especificación CDI 1.1.
Como no beans.xml
su beans.xml
, es difícil saber si este archivo es parte del problema o no.
Parece que el archivo de DAOTest no tiene beans.xml / misplaced beans.xml.