JBoss EAP 7.1 Spring-数据-JPA CDI 扩展
JBoss EAP 7.1 Spring-Data-JPA CDI Extension
我们有一个应用程序使用 Spring Data JPA 存储库注入 EJB。 Spring 的 org.springframework.data.jpa.repository.cdi.JpaRepositoryExtension
很神奇。
它在 CDI 中查找 EntityManager,将其保存以备后用,使用 @Repository
注释查找 Spring Data JPA 存储库,并保存它们的类型以备后用。当 CDI 初始化时,JpaRepositoryExtension::afterBeanDiscovery
运行并创建正确的 bean 并将其插入到 CDI 中。这在 JBoss EAP 6.2/6.3/6.4 下完美运行。
JBoss EAP 7.1 基于 WildFly 11 构建,Hibernate 版本现在为 5.1。 JPA bootstrap 代码已在 JBoss 和 Hibernate JPA 提供程序中进行了重组。由于这次重组,运行时 EntityManager not 在 CDI 中:
org.springframework.data.jpa.repository.cdi.JpaRepositoryExtension.processBean(ProcessBean<X>)
这最终会导致...
org.springframework.data.jpa.repository.cdi.JpaRepositoryExtension.createRepositoryBean(Class<?>, Set<Annotation>, BeanManager)
...投掷:
javax.enterprise.inject.UnsatisfiedResolutionException: Unable to
resolve a bean for 'javax.persistence.EntityManager' with qualifiers
[@javax.enterprise.inject.Default(), @javax.enterprise.inject.Any()].
at
org.springframework.data.jpa.repository.cdi.JpaRepositoryExtension.createRepositoryBean(JpaRepositoryExtension.java:120)
at
org.springframework.data.jpa.repository.cdi.JpaRepositoryExtension.afterBeanDiscovery(JpaRepositoryExtension.java:96)
是否有人成功将 Spring Data JPA 部署到 JBoss EAP 7.1 或 WildFly 11+ 并获得了在 CDI 中创建的 JPA 存储库?
编辑:
我有一个在 EAP 6.2/3/4 中运行良好的 CDI Producer:
@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 ;
}
您可以尝试 using/adding 对您的 实体管理器 添加一些注释,这可能会解决 issue.Have 您尝试过的问题:
@Produces<br>
@Dependent<br>
@PersistenceContext<br>
私有实体管理器实体管理器;
这可能适用于 eap 7.1
我的问题的解决方案是两个小改动:
- 将@ApplicationScoped 添加到生产者class。显然 WELD 不再看到 @Producer 注释并在没有这个(我认为)的情况下处理生产者 class 因为默认范围是 @Dependent.
- 从 createEntityManager(...) 生产者方法中删除 @PersistenceContext 和参数,改为在其中引用 entityManagerFactory。奇怪的是,这甚至适用于自 @PersistenceContext "Expresses a dependency on a container-managed EntityManager..." 以来的早期版本,因为参数是 EntityManagerFactory。
我的制作人class:
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() ;
}
}
我们有一个应用程序使用 Spring Data JPA 存储库注入 EJB。 Spring 的 org.springframework.data.jpa.repository.cdi.JpaRepositoryExtension
很神奇。
它在 CDI 中查找 EntityManager,将其保存以备后用,使用 @Repository
注释查找 Spring Data JPA 存储库,并保存它们的类型以备后用。当 CDI 初始化时,JpaRepositoryExtension::afterBeanDiscovery
运行并创建正确的 bean 并将其插入到 CDI 中。这在 JBoss EAP 6.2/6.3/6.4 下完美运行。
JBoss EAP 7.1 基于 WildFly 11 构建,Hibernate 版本现在为 5.1。 JPA bootstrap 代码已在 JBoss 和 Hibernate JPA 提供程序中进行了重组。由于这次重组,运行时 EntityManager not 在 CDI 中:
org.springframework.data.jpa.repository.cdi.JpaRepositoryExtension.processBean(ProcessBean<X>)
这最终会导致...
org.springframework.data.jpa.repository.cdi.JpaRepositoryExtension.createRepositoryBean(Class<?>, Set<Annotation>, BeanManager)
...投掷:
javax.enterprise.inject.UnsatisfiedResolutionException: Unable to resolve a bean for 'javax.persistence.EntityManager' with qualifiers [@javax.enterprise.inject.Default(), @javax.enterprise.inject.Any()]. at org.springframework.data.jpa.repository.cdi.JpaRepositoryExtension.createRepositoryBean(JpaRepositoryExtension.java:120) at org.springframework.data.jpa.repository.cdi.JpaRepositoryExtension.afterBeanDiscovery(JpaRepositoryExtension.java:96)
是否有人成功将 Spring Data JPA 部署到 JBoss EAP 7.1 或 WildFly 11+ 并获得了在 CDI 中创建的 JPA 存储库?
编辑: 我有一个在 EAP 6.2/3/4 中运行良好的 CDI Producer:
@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 ;
}
您可以尝试 using/adding 对您的 实体管理器 添加一些注释,这可能会解决 issue.Have 您尝试过的问题:
@Produces<br>
@Dependent<br>
@PersistenceContext<br>
私有实体管理器实体管理器;
这可能适用于 eap 7.1
我的问题的解决方案是两个小改动:
- 将@ApplicationScoped 添加到生产者class。显然 WELD 不再看到 @Producer 注释并在没有这个(我认为)的情况下处理生产者 class 因为默认范围是 @Dependent.
- 从 createEntityManager(...) 生产者方法中删除 @PersistenceContext 和参数,改为在其中引用 entityManagerFactory。奇怪的是,这甚至适用于自 @PersistenceContext "Expresses a dependency on a container-managed EntityManager..." 以来的早期版本,因为参数是 EntityManagerFactory。
我的制作人class:
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() ;
}
}