У меня проблема с инъекцией CDI. Я хочу создать свой DAO-слой с JPA и моим бизнес-слоем с помощью EJB, а затем с помощью CDI ввести DAO в Business Threat Logic.CDI-инъекция с общими интерфейсами
Для этого я определяю для своего слоя DAO. Один общий интерфейс dao содержит методы CRUD и его общую реализацию dao (абстрактный класс, реализующий общий интерфейс).
После этого я определяю конкретные интерфейсы, которые реализуют общий интерфейс и расширяет общий абстрактный класс.
И я пишу всю специфику dao.
В моем бизнес-слое я пишу интерфейс IGenericMetier, который возвращает все методы CRUD, а абстрактный класс GenericMetier - реализацию IGenericMetier. Внутри GenericMetier я добавляю интерфейс GenericDao, чтобы иметь доступ ко всем методам CRUD. Для каждого объекта у меня есть два (2) интерфейса (локальный и удаленный), который расширяет IGenericMetier и сущность EJB Session, которые реализуют два интерфейса.
Когда я развернуть проект EAR, есть много ошибок: org.jboss.weld.exceptions.DeploymentException: WELD-001409 Неоднозначность зависимости для типа ...
DAO слой:
/** 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();
}
Реализация этого интерфейса
/** 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();
}
}
у меня есть 12 классов, но я дам здесь две реализации
Специфические Интерфейсы:
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> {
}
Специфические 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{
}
Здесь вы бизнес-слой Code
Общий интерфейс для 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();
}
Реализация этого gneric интерфейсаПримечание: я впрыскивается интерфейс IGnericDao в этой реализации
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();
}
}
И у меня есть два интерфейса (локальных и удаленных) для каждого объекта, который проходит Интерфейс IGenericMetier.
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> {
}
Роли Интерфейсы
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> {
}
Чтобы закончить там реализаций (Stateless EJB)
Направление службы 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 {
}
ролей Служба 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 {
}
Может ли кто-нибудь помочь мне исправить ошибку? Когда я раскрываю, у меня есть эти ошибки:
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)
Как я могу исправить эту ошибку? Спасибо за ваш ответ
Voawww! Я действительно потерял зрение где-то посередине: S – ilter
OT: «EntityManager» уже является DAO сам по себе, так зачем его снова завертывать? – Smutje