我们有一个应用程序,它使用Spring存储库注入到EJB中。Spring的org.springframework.data.jpa.repository.cdi.JpaRepositoryExtension发挥了神奇的作用。
它在CDI中查找EntityManager,保存它供以后使用,使用@Repository注释查找Spring存储库,并保存它们的类型供以后使用。初始化CDI时,JpaRepositoryExtension::afterBeanDiscovery将运行并执行正确的bean创建和插入到CDI中。这在JBoss EAP6.2/6.3/6.4下非常有效。
JBoss EAP7.1构建在WildFly 11上,Hibernate版本现在是5.1。JPA引导代码已经在JBoss和Hibernate JPA提供程序中进行了重组。由于这种重组,在运行时,EntityManager是而不是CDI中的:
org.springframework.data.jpa.repository.cdi.JpaRepositoryExtension.processBean(ProcessBean<X>)这最终导致..。
org.springframework.data.jpa.repository.cdi.JpaRepositoryExtension.createRepositoryBean(Class<?>, Set<Annotation>, BeanManager)...to掷:
javax.enterprise.inject.UnsatisfiedResolutionException:无法使用限定符@javax.enterprise.inject.Default()、@javax.enterprise.inject.Any()解析“javax.persistence.EntityManager”的bean。在org.springframework.data.jpa.repository.cdi.JpaRepositoryExtension.createRepositoryBean(JpaRepositoryExtension.java:120) at org.springframework.data.jpa.repository.cdi.JpaRepositoryExtension.afterBeanDiscovery(JpaRepositoryExtension.java:96)
是否有人成功地将Spring部署到JBoss EAP7.1或WildFly 11+上,并获得了在CDI中创建的JPA存储库?
编辑:我有一个CDI生产者,在EAP 6.2/3/4中运行良好:
@Produces
@Dependent
@PersistenceUnit( unitName="** Our PU Name **" )
private EntityManagerFactory entityManagerFactory;
.
.
.
@Produces
@RequestScoped
@PersistenceContext( type = PersistenceContextType.EXTENDED )
public EntityManager createEntityManager( EntityManagerFactory emf )
{
EntityManager em = emf.createEntityManager();
return em ;
}发布于 2018-08-23 17:14:05
解决我的问题的办法是两个小的改变:
我的制片班:
import javax.enterprise.context.ApplicationScoped ;
import javax.enterprise.context.Dependent ;
import javax.enterprise.context.RequestScoped ;
import javax.enterprise.inject.Disposes ;
import javax.enterprise.inject.Produces ;
import javax.persistence.EntityManager ;
import javax.persistence.EntityManagerFactory ;
import javax.persistence.PersistenceUnit ;
@ApplicationScoped
public class CdiConfig
{
/*
* Entity Manager Factory
*/
@Produces
@Dependent
@PersistenceUnit(unitName = "stafftrack_data_access")
private EntityManagerFactory entityManagerFactory ;
/*
* Entity Manager
*/
@Produces
@RequestScoped
public EntityManager createEntityManager( )
{
EntityManager em = entityManagerFactory.createEntityManager() ;
return em ;
}
public void close( @Disposes EntityManager entityManager )
{
entityManager.close() ;
}
}发布于 2018-08-14 05:03:33
您可以尝试在您的实体管理器中使用/添加少量注释来解决您尝试过的issue.Have:
@Produces
`@Dependent` `@PersistenceContext` `private EntityManager entityManager;` This may work with eap 7.1https://stackoverflow.com/questions/51756761
复制相似问题