web-dev-qa-db-fra.com

CDI: WELD-001408 Dépendances insatisfaites, comment le résoudre?

Je fais un petit projet de test avec CDI. Mon application est composée d'un EJB EAR et WAR, tous déployés sur Glassfish 4. J'utilise Hibernate 4.3.4 pour accéder à la base de données.

Mon objectif est de vérifier qu'une classe dans un EJB (DAO) peut recevoir une injection d'un EntityManager.

Le pattern SessionBean + EJB n'est pas fantastique mais je dois modifier une application déjà créée donc je n'ai pas beaucoup de choix.

Voici mon code de l'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
    }

}

Service.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();

    }


}

et ServiceLocal.Java

@Local
public interface ServiceLocal {
    void test();
}

Et à l'intérieur de ma guerre:

@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
    }


 }

J'ai testé le DAOTest en l'annotant avec l'annotation @ Stateless. Tout se passe comme il se doit. Le CDI fonctionne donc bien. Mais avec juste @ Named, il ne veut pas fonctionner.

Une idée?

Le stacktrace:

org.jboss.weld.exceptions.DeploymentException: WELD-001408 Unsatisfied dependencies for type [DAOTest] with qualifiers [@Default] at injection point [[BackedAnnotatedField] @Inject test.Service.test]

My 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>
19
Scandinave

Java EE 7 a des archives implicites de bean par défaut, c'est-à-dire qu'une classe de bean nécessite une annotation de portée pour être découverte en tant que bean CDI.

@Named n'est pas une annotation de portée. Essayez @Dependent au lieu.

beans.xml n'est plus requis dans CDI 1.1/Java EE 7. Si vous en avez une, la version exacte et le bean-discovery-mode faites une différence. Voir la section Bean archives de la spécification CDI 1.1.

Comme vous n'avez pas posté votre beans.xml, il est difficile de dire si ce fichier fait partie du problème.

14
Harald Wellmann

Comme c'est le premier hit que j'ai obtenu en recherchant WELD-001408, permettez-moi également de mentionner une cause qui est le manque de constructeur sans argument. Ce n'était apparemment PAS le cas pour le PO mais c'était la cause du problème dans mon propre cas, donc cela peut aussi aider les autres.

7
Scott Kurz

On dirait que l'archive de DAOTest n'a pas de beans.xml/beans.xml mal placé.

0
covener

@LocalBean signifie que vous injecterez le bean et non l'interface

@Inject Service service

et pas

@Inject ServiceLocal service
0
cyril