2014-02-17 1 views
0

Извините за мой английский, у меня есть военный проект с cdi 1.0, deltaspike 0.5 и primefaces 4.0, когда я пытаюсь использовать @Respository с @EntityManagerConfig, потому что у меня есть два продукта для EntityManager с Diferent @Qualifiers, я использую GlassFish 4 для сервера приложений это де код Repository, Изготавливает и EntityManagerResolver:deltaspike резидентный объект entitymanagerresolver ошибка с двумя производит entityManger

Repository:

@Repository(forEntity = User.class) 
@EntityManagerConfig(entityManagerResolver = HbsWebEntityManagerResolver.class, flushMode = FlushModeType.AUTO) 
public abstract class UserRepository extends 
    AbstractEntityRepository<User, Integer> { 

    @Query(named = User.BY_LOGIN) 
    public abstract User findByLoginEqual(@QueryParam("login") String login); 

} 

EntityManagerResolver:

public class HbsWebEntityManagerResolver implements EntityManagerResolver{ 

    @Inject 
    @HbsWeb 
    private EntityManager hbsWebEntityManager; 

    @Override 
    public EntityManager resolveEntityManager() {  
     return hbsWebEntityManager; 
} 

} 

Производит:

@ApplicationScoped 
public class EntityManagerProducer { 

    @PersistenceUnit(unitName="HBS") 
     private EntityManagerFactory hbsEntityManager; 

    @PersistenceUnit(unitName="HBSWEB") 
    private EntityManagerFactory hbsWebEntityManager; 

    @Produces 
    @Hbs  
    protected EntityManager createHbsEntityManager() { 
     return hbsEntityManager.createEntityManager(); 
    } 

    protected void closeHbsEntityManager(
      @Disposes @Hbs EntityManager entityManager) { 
     if (entityManager.isOpen()) { 
      entityManager.close(); 
     } 
    } 

    @Produces 
    @HbsWeb 
    protected EntityManager createHbsWebEntityManager() { 
     return hbsWebEntityManager.createEntityManager(); 
    } 

    protected void closeHbsWebEntityManager(
      @Disposes @HbsWeb EntityManager entityManager) { 
     if (entityManager.isOpen()) { 
      entityManager.close(); 
     } 
    } 

} 

Когда я пытаюсь использовать репозиторий с @Inject я получаю ошибку последующей:

org.apache.deltaspike.data.impl.handler.QueryInvocationException: Exception calling Repository: [Repository=class co.com.compuhelmac.hbs.repository.UserRepository_$$_javassist_0,method=findByLoginEqual],exception=class org.jboss.weld.exceptions.AmbiguousResolutionException,message=WELD-001318 Cannot resolve an ambiguous dependency between [Producer Method [EntityManager] with qualifiers [@Hbs @Any] declared as [[BackedAnnotatedMethod] @Produces @Hbs protected co.com.compuhelmac.hbs.database.EntityManagerProducer.createHbsEntityManager()], Producer Method [EntityManager] with qualifiers [@HbsWeb @Any] declared as [[BackedAnnotatedMethod] @Produces @HbsWeb protected co.com.compuhelmac.hbs.database.EntityManagerProducer.createHbsWebEntityManager()]] 
    at org.apache.deltaspike.data.impl.handler.QueryHandler.invoke(QueryHandler.java:86) 
    at org.apache.deltaspike.partialbean.impl.PartialBeanAbstractMethodHandler.invoke(PartialBeanAbstractMethodHandler.java:44) 
    at org.apache.deltaspike.partialbean.impl.MethodHandlerProxy.invoke(MethodHandlerProxy.java:35) 
    at com.sun.proxy.$Proxy549.invoke(Unknown Source) 
    at co.com.compuhelmac.hbs.repository.UserRepository_$$_javassist_0.findByLoginEqual(UserRepository_$$_javassist_0.java) 
    at co.com.compuhelmac.hbs.security.HbsLoginEJB.login(HbsLoginEJB.java:46) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:606) 
    at org.glassfish.ejb.security.application.EJBSecurityManager.runMethod(EJBSecurityManager.java:1081) 
    at org.glassfish.ejb.security.application.EJBSecurityManager.invoke(EJBSecurityManager.java:1153) 
    at com.sun.ejb.containers.BaseContainer.invokeBeanMethod(BaseContainer.java:4695) 
    at com.sun.ejb.EjbInvocation.invokeBeanMethod(EjbInvocation.java:630) 
    at com.sun.ejb.containers.interceptors.AroundInvokeChainImpl.invokeNext(InterceptorManager.java:822) 
    at com.sun.ejb.EjbInvocation.proceed(EjbInvocation.java:582) 
    at org.jboss.weld.ejb.AbstractEJBRequestScopeActivationInterceptor.aroundInvoke(AbstractEJBRequestScopeActivationInterceptor.java:46) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 

Caused by: org.jboss.weld.exceptions.AmbiguousResolutionException: WELD-001318 Cannot resolve an ambiguous dependency between [Producer Method [EntityManager] with qualifiers [@Hbs @Any] declared as [[BackedAnnotatedMethod] @Produces @Hbs protected co.com.compuhelmac.hbs.database.EntityManagerProducer.createHbsEntityManager()], Producer Method [EntityManager] with qualifiers [@HbsWeb @Any] declared as [[BackedAnnotatedMethod] @Produces @HbsWeb protected co.com.compuhelmac.hbs.database.EntityManagerProducer.createHbsWebEntityManager()]] 
    at org.jboss.weld.manager.BeanManagerImpl.resolve(BeanManagerImpl.java:1154) 
    at org.jboss.weld.manager.BeanManagerImpl.getBean(BeanManagerImpl.java:798) 
    at org.jboss.weld.bean.builtin.InstanceImpl.get(InstanceImpl.java:79) 
    at org.apache.deltaspike.data.impl.handler.EntityManagerLookup.lookupFor(EntityManagerLookup.java:51) 
    at org.apache.deltaspike.data.impl.handler.QueryHandler.createContext(QueryHandler.java:97) 
    at org.apache.deltaspike.data.impl.handler.QueryHandler.invoke(QueryHandler.java:74) 

Кто-нибудь знает, почему эта ошибка происходит?

ответ

0

Going вашим StackTrace

org.apache.deltaspike.data.impl.handler.EntityManagerLookup.lookupFor(EntityManagerLookup.java:51) 

и взглянуть на источники DeltaSpike 0,5, я бы сказал, что это ошибка в версии 0.5, так как EntityManager получается из EntityManagerResolver никогда не используется.

Повторите попытку с помощью DeltaSpike 0.6-SNAPSHOT - в модуле Data есть много улучшений, и теперь этот фрагмент кода выглядит более корректным.

0

Ваш EM распознаватель вызывался, но проблема при попытке внедрить в

@Inject 
@HbsWeb 
private EntityManager hbsWebEntityManager; 

В связи с проблемой разрешения между: createHbsWebEntityManager() и createHbsEntityManager()

Как являются @HbsWeb и @Hbs? они связаны?

Смежные вопросы