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() ;
    }
}