Reputation: 139
I have a problem with CDI injection. I want to build my DAO Layer with JPA and my Business Layer with EJB then using CDI to inject my DAO into Business Threat Logic.
For this, I define for my DAO layer One generic dao interface with contains CRUD methods and his generic dao implementation (an abstract class which implement a generic interface).
After, I define specific interfaces which implements Generic inteface and extends generic abstract class.
And I write a all of specifics dao.
In my Business Layer, I write a IGenericMetier interface which take back all CRUD methods, and a GenericMetier abstract class an implementation of IGenericMetier. Inside of GenericMetier, I inject a GenericDao interface to have access to all CRUD methods. For every entity I have Two (2) interfaces (Local and Remote) which extends IGenericMetier and a entity EJB Session which implement the two interfaces.
When I deploy the EAR project, there are many errors: org.jboss.weld.exceptions.DeploymentException: WELD-001409 Ambiguous dependencies for type ...
DAO Layer:
/** Generic methods for CRUD Operation **/
public interface IGenericDao<T extends GenericDto> {
public T save(T obj) throws ExceptionDAO;
public T consulter(Object id) throws ExceptionDAO;
public T modifier(T obj) throws ExceptionDAO;
public void supprimer(T obj) throws ExceptionDAO;
public List<T> recupererTout() throws ExceptionDAO;
public void flush();
}
Implementation of this interface
/** Generic Implementation of this interfaces **/
package com.omfd.dao.generic;
import java.lang.reflect.ParameterizedType;
import java.util.List;
import javax.enterprise.inject.Default;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import com.omfd.dao.exception.ExceptionDAO;
import com.omfd.dto.core.GenericDto;
public abstract class GenericDao<T extends GenericDto> implements IGenericDao<T> {
@PersistenceContext
private EntityManager em;
protected Class<T> entityClass;
@SuppressWarnings("unchecked")
public GenericDao() {
ParameterizedType genericSuperClass = (ParameterizedType)getClass().getGenericSuperclass();
this.entityClass = (Class<T>)genericSuperClass.getActualTypeArguments()[0];
}
@Override
public T save(T obj) throws ExceptionDAO {
try {
em.persist(obj);
return obj;
} catch (Exception e) {
throw new ExceptionDAO("Une erreur est survenue");
}
}
@Override
public T consulter(Object id) throws ExceptionDAO {
try {
T entity = em.find(entityClass, id);
return entity;
} catch (Exception ex) {
throw new ExceptionDAO("Une erreur est survenue. Causse: "+ex.getCause());
}
}
@Override
public void supprimer(T obj) throws ExceptionDAO {
obj = em.merge(obj);
em.remove(obj);
}
@Override
public T modifier(T obj) throws ExceptionDAO {
try {
T tModifie = em.merge(obj);
return tModifie;
} catch (Exception e) {
throw new ExceptionDAO("Une erreur est survenue lors de la modification. Cause: "+e.getCause());
}
}
@SuppressWarnings("unchecked")
public List<T> recupererTout() throws ExceptionDAO {
try {
return em.createQuery("select obj from "+ entityClass.getSimpleName() +" obj").getResultList();
} catch (Exception e) {
throw new ExceptionDAO("Une erreur est survenue lors de la récupération des données.");
}
}
@Override
public void flush() {
em.flush();
}
}
I have 12 Classes, but I'll give here two implementations
Specifics Interfaces:
package com.omfd.dao.interfaces;
import com.oci.omfd.entities.Direction;
import com.omfd.dao.generic.IGenericDao;
public interface IDirectionDao extends IGenericDao<Direction> {
}
package com.omfd.dao.interfaces;
import com.oci.omfd.entities.Roles;
import com.omfd.dao.generic.IGenericDao;
public interface IRolesDao extends IGenericDao<Roles> {
}
Specifics DAOs
package com.omfd.dao.impl;
import com.oci.omfd.entities.Direction;
import com.omfd.dao.exception.ExceptionDAO;
import com.omfd.dao.generic.GenericDao;
import com.omfd.dao.interfaces.IDirectionDao;
public class DirectionDao extends GenericDao<Direction> implements IDirectionDao {
}
package com.omfd.dao.impl;
import com.oci.omfd.entities.Roles;
import com.omfd.dao.generic.GenericDao;
import com.omfd.dao.interfaces.IRolesDao;
public class RolesDao extends GenericDao<Roles> implements IRolesDao{
}
Here you are The Business Layer Code
Generic interface for CRUD
public interface IGenericMetier<T extends GenericDto> {
public T save(T obj) throws ExceptionBusiness;
public T consulter(Object id) throws ExceptionBusiness;
public T modifier(T obj) throws ExceptionBusiness;
public void supprimer(T obj) throws ExceptionBusiness;
public List<T> recupererTout() throws ExceptionBusiness;
public void flush();
}
The implementation of this gneric interface Note: I injected the IGnericDao interface into this implementation
package com.omfd.metier.generic;
import java.util.List;
import javax.inject.Inject;
import com.omfd.dao.exception.ExceptionBusiness;
import com.omfd.dao.exception.ExceptionDAO;
import com.omfd.dao.generic.GenericDao;
import com.omfd.dao.generic.IGenericDao;
import com.omfd.dto.core.GenericDto;
public abstract class GenericMetier<T extends GenericDto> implements IGenericMetier<T> {
@Inject
private IGenericDao<T> dao;
@Override
public T save(T dir) throws ExceptionBusiness {
try {
return dao.save(dir);
} catch (ExceptionDAO e) {
throw new ExceptionBusiness(e.getMessage());
}
}
@Override
public T consulter(Object id) throws ExceptionBusiness {
T entity = null;
try {
entity = dao.consulter(id);
} catch (ExceptionDAO e) {
throw new ExceptionBusiness(e.getMessage());
}
return entity;
}
@Override
public void supprimer(T obj) throws ExceptionBusiness {
try {
dao.supprimer(obj);
} catch (ExceptionDAO e) {
throw new ExceptionBusiness(e.getMessage());
}
}
@Override
public T modifier(T obj) throws ExceptionBusiness {
try {
return dao.modifier(obj);
} catch (ExceptionDAO e) {
throw new ExceptionBusiness(e.getMessage());
}
}
public List<T> recupererTout() throws ExceptionBusiness{
try {
return dao.recupererTout();
} catch (ExceptionDAO e) {
throw new ExceptionBusiness(e.getMessage());
}
}
@Override
public void flush() {
dao.flush();
}
}
And I have Two Interfaces (local and remote) for each entity which extends IGenericMetier interface.
package com.omfd.metier.interfaces;
import javax.ejb.Local;
import com.oci.omfd.entities.Direction;
import com.omfd.metier.generic.IGenericMetier;
@Local
public interface IDirectionLocal extends IGenericMetier<Direction> {
}
package com.omfd.metier.interfaces;
import javax.ejb.Remote;
import com.oci.omfd.entities.Direction;
import com.omfd.metier.generic.IGenericMetier;
@Remote
public interface IDirectionRemote extends IGenericMetier<Direction> {
}
Roles Interfaces
package com.omfd.metier.interfaces;
import javax.ejb.Local;
import com.oci.omfd.entities.Roles;
import com.omfd.metier.generic.IGenericMetier;
@Local
public interface IRolesLocal extends IGenericMetier<Roles> {
}
package com.omfd.metier.interfaces;
import javax.ejb.Remote;
import com.oci.omfd.entities.Roles;
import com.omfd.metier.generic.IGenericMetier;
@Remote
public interface IRolesRemote extends IGenericMetier<Roles> {
}
To finish there implementations (Stateless EJB)
Direction Service ejb
package com.omfd.metier.impl;
import javax.ejb.Stateless;
import com.oci.omfd.entities.Direction;
import com.omfd.metier.generic.GenericMetier;
import com.omfd.metier.interfaces.IDirectionLocal;
import com.omfd.metier.interfaces.IDirectionRemote;
@Stateless(name="DS")
public class DirectionServices extends GenericMetier<Direction> implements IDirectionLocal, IDirectionRemote {
}
Roles Service EJB
package com.omfd.metier.impl;
import javax.ejb.Stateless;
import com.oci.omfd.entities.Roles;
import com.omfd.metier.generic.GenericMetier;
import com.omfd.metier.interfaces.IRolesLocal;
import com.omfd.metier.interfaces.IRolesRemote;
@Stateless(name="RS")
public class RolesServices extends GenericMetier<Roles> implements IRolesLocal, IRolesRemote {
}
Can someone helps me to fixe thes error ? When I deploy, I have these errors:
Exception 0 :
org.jboss.weld.exceptions.DeploymentException: WELD-001409 Ambiguous dependencies for type [IGenericDao<T>] with qualifiers [@Default] at injection point [[field] @Inject private com.omfd.metier.generic.GenericMetier.dao]. Possible dependencies [[Managed Bean [class com.omfd.dao.impl.NatureFraisDao] with qualifiers [@Any @Default], Managed Bean [class com.omfd.dao.impl.ServiceDao] with qualifiers [@Any @Default], Managed Bean [class com.omfd.dao.impl.OrdreMissionDao] with qualifiers [@Any @Default], Managed Bean [class com.omfd.dao.impl.CumulsDao] with qualifiers [@Any @Default], Managed Bean [class com.omfd.dao.impl.RolesDao] with qualifiers [@Any @Default], Managed Bean [class com.omfd.dao.impl.FraisDeplacement2Dao] with qualifiers [@Any @Default], Managed Bean [class com.omfd.dao.impl.FraisDeplacement1Dao] with qualifiers [@Any @Default], Managed Bean [class com.omfd.dao.impl.PersonnelDao] with qualifiers [@Any @Default], Managed Bean [class com.omfd.dao.impl.NouveauOrdreMissionDao] with qualifiers [@Any @Default], Managed Bean [class com.omfd.dao.impl.UserDao] with qualifiers [@Any @Default], Managed Bean [class com.omfd.dao.impl.DemandeOrdreMissionDao] with qualifiers [@Any @Default], Managed Bean [class com.omfd.dao.impl.DirectionDao] with qualifiers [@Any @Default]]]
at org.jboss.weld.bootstrap.Validator.validateInjectionPoint(Validator.java:278)
at org.jboss.weld.bootstrap.Validator.validateInjectionPoint(Validator.java:244)
at org.jboss.weld.bootstrap.Validator.validateBean(Validator.java:107)
at org.jboss.weld.bootstrap.Validator.validateRIBean(Validator.java:127)
at org.jboss.weld.bootstrap.Validator.validateBeans(Validator.java:346)
at org.jboss.weld.bootstrap.Validator.validateDeployment(Validator.java:331)
at org.jboss.weld.bootstrap.WeldBootstrap.validateBeans(WeldBootstrap.java:366)
at org.jboss.as.weld.WeldContainer.start(WeldContainer.java:83)
at org.jboss.as.weld.services.WeldService.start(WeldService.java:76)
at org.jboss.msc.service.ServiceControllerImpl$StartTask.startService(ServiceControllerImpl.java:1811)
at org.jboss.msc.service.ServiceControllerImpl$StartTask.run(ServiceControllerImpl.java:1746)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:885)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:907)
at java.lang.Thread.run(Thread.java:619)
Exception 0 :
org.jboss.weld.exceptions.DeploymentException: WELD-001409 Ambiguous dependencies for type [IGenericDao<T>] with qualifiers [@Default] at injection point [[field] @Inject private com.omfd.metier.generic.GenericMetier.dao]. Possible dependencies [[Managed Bean [class com.omfd.dao.impl.NatureFraisDao] with qualifiers [@Any @Default], Managed Bean [class com.omfd.dao.impl.ServiceDao] with qualifiers [@Any @Default], Managed Bean [class com.omfd.dao.impl.OrdreMissionDao] with qualifiers [@Any @Default], Managed Bean [class com.omfd.dao.impl.CumulsDao] with qualifiers [@Any @Default], Managed Bean [class com.omfd.dao.impl.RolesDao] with qualifiers [@Any @Default], Managed Bean [class com.omfd.dao.impl.FraisDeplacement2Dao] with qualifiers [@Any @Default], Managed Bean [class com.omfd.dao.impl.FraisDeplacement1Dao] with qualifiers [@Any @Default], Managed Bean [class com.omfd.dao.impl.PersonnelDao] with qualifiers [@Any @Default], Managed Bean [class com.omfd.dao.impl.NouveauOrdreMissionDao] with qualifiers [@Any @Default], Managed Bean [class com.omfd.dao.impl.UserDao] with qualifiers [@Any @Default], Managed Bean [class com.omfd.dao.impl.DemandeOrdreMissionDao] with qualifiers [@Any @Default], Managed Bean [class com.omfd.dao.impl.DirectionDao] with qualifiers [@Any @Default]]]
at org.jboss.weld.bootstrap.Validator.validateInjectionPoint(Validator.java:278)
at org.jboss.weld.bootstrap.Validator.validateInjectionPoint(Validator.java:244)
at org.jboss.weld.bootstrap.Validator.validateBean(Validator.java:107)
at org.jboss.weld.bootstrap.Validator.validateRIBean(Validator.java:127)
at org.jboss.weld.bootstrap.Validator.validateBeans(Validator.java:346)
at org.jboss.weld.bootstrap.Validator.validateDeployment(Validator.java:331)
at org.jboss.weld.bootstrap.WeldBootstrap.validateBeans(WeldBootstrap.java:366)
at org.jboss.as.weld.WeldContainer.start(WeldContainer.java:83)
at org.jboss.as.weld.services.WeldService.start(WeldService.java:76)
at org.jboss.msc.service.ServiceControllerImpl$StartTask.startService(ServiceControllerImpl.java:1811)
at org.jboss.msc.service.ServiceControllerImpl$StartTask.run(ServiceControllerImpl.java:1746)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:885)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:907)
at java.lang.Thread.run(Thread.java:619)
How can I fix this error ? Thank you for your answer
Upvotes: 0
Views: 2403
Reputation: 89
Most likely you run into this old bug: https://issues.jboss.org/browse/WELD-1111 This is fixed in Weld 1.1.8.Final and newer releases.
Upvotes: 0