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
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
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
1 2 3 4 5
|
@Local
public interface ServiceLocal {
void test();
} |
Dans mon WAR j'ai :
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 :
org.jboss.weld.exceptions.DeploymentException: WELD-001408 Unsatisfied dependencies for type [DAOTest] with qualifiers [@Default] at injection point [[BackedAnnotatedField] @Inject test.Service.test]
Partager