我有CDI注射的問題。我想用JPA構建DAO層,用EJB構建業務層,然後使用CDI將我的DAO注入業務威脅邏輯。CDI注射與通用接口
對於這一點,我定義我的DAO層的一種通用的DAO接口,包含CRUD方法和他的通用的DAO實現(實現一個通用接口一個抽象類)。
之後,我定義它實現通用inteface並擴展通用抽象類特定的接口。
我寫了一個所有的細節道。
在我的業務層,我寫了IGenericMetier接口,收回所有的CRUD方法,以及GenericMetier抽象類IGenericMetier的實現。在GenericMetier內部,我注入了GenericDao接口以訪問所有CRUD方法。 對於每個實體,我都有兩個(2)接口(本地和遠程),它們擴展了IGenericMetier和實現這兩個接口的實體EJB會話。
當我部署的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> {
}
具體細節的DAO
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{
}
在這裏,你是業務層代碼
通用接口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> {
}
要完成那裏實現(無狀態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