2015-04-26 63 views
0

我有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) 

我怎樣才能解決這個問題?謝謝你的回答

+1

Voawww!我真的失去了在中間的某個地方:S – ilter

+1

OT:「EntityManager」本身已經是一個DAO,那爲什麼要重新包裝呢? – Smutje

回答