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

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

Le pattern SessionBean + EJB n'est pas fantastique mais je vais devoir modifier une application déjà créer donc je n'est pas trop le choix.

Voici mon code de l'EJB :
DAOTest.java
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
@Namedpublic 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
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
@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

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
 
@Local
public interface ServiceLocal {
    void test();
}
Dans mon WAR j'ai :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
 
@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é en annotant le DAOTest avec l'annotation @Stateless. Tout ce passe comme il faut. Donc CDI fonctionne bien. Mais avec juste @Named cela ne veux pas fonctionner.

Une idée?

La stacktrace :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
org.jboss.weld.exceptions.DeploymentException: WELD-001408 Unsatisfied dependencies for type [DAOTest] with qualifiers [@Default] at injection point [[BackedAnnotatedField] @Inject test.Service.test]