【问题标题】:JBoss EAP 7.1 Spring-Data-JPA CDI ExtensionJBoss EAP 7.1 Spring-Data-JPA CDI 扩展
【发布时间】:2018-08-08 22:58:28
【问题描述】:

我们有一个使用 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 引导代码已在 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)

...投掷:

javax.enterprise.inject.UnsatisfiedResolutionException: 无法 使用限定符解析 'javax.persistence.EntityManager' 的 bean [@javax.enterprise.inject.Default(),@javax.enterprise.inject.Any()]。 在 org.springframework.data.jpa.repository.cdi.JpaRepositoryExtension.createRepositoryBean(JpaRepositoryExtension.java:120) 在 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 ;
    }

【问题讨论】:

    标签: spring hibernate jpa spring-data-jpa jboss-eap-7


    【解决方案1】:

    我的问题的解决方案是两个小改动:

    • 将@ApplicationScoped 添加到生产者类。显然 WELD 不再看到 @Producer 注释并在没有这个(我认为)的情况下处理生产者类,因为默认范围是 @Dependent。
    • 从 createEntityManager(...) 生产者方法中删除 @PersistenceContext 和参数,改为在其中引用 entityManagerFactory。奇怪的是,这甚至适用于早期版本,因为 @PersistenceContext “表达对容器管理的 EntityManager...

    我的制作人班:

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

    【讨论】:

    • 嗨,Cary,你能分享一下完整的例子吗,你是如何产生 EntityManager 的?想不通。干杯
    【解决方案2】:

    您可以尝试在 Entity Manager 中使用/添加一些注释,这可能会解决问题。您尝试过吗:
    @Produces
    @Dependent
    @PersistenceContext
    private EntityManager entityManager;
    这可能适用于 eap 7.1

    【讨论】:

      猜你喜欢
      • 2017-01-20
      • 1970-01-01
      • 2019-05-10
      • 2020-02-24
      • 2021-02-22
      • 2015-01-14
      • 2016-10-10
      • 2018-09-18
      • 1970-01-01
      相关资源
      最近更新 更多