2015-04-26 8 views
0

У меня проблема с инъекцией 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) 

Как я могу исправить эту ошибку? Спасибо за ваш ответ

+1

Voawww! Я действительно потерял зрение где-то посередине: S – ilter

+1

OT: «EntityManager» уже является DAO сам по себе, так зачем его снова завертывать? – Smutje

ответ