当前位置: 首页 > 知识库问答 >
问题:

JBoss EAP 7.1 Spring-Data-JPA CDI扩展

充阳秋
2023-03-14

我们有一个应用程序,它使用Spring数据JPA存储库注入EJB。springframework。数据jpa。存储库。cdi。JpaRepositoryExtension发挥了神奇的作用。

它在CDI中查找EntityManager,保存以备后用,使用@Repository注释查找Spring Data JPA存储库,并保存它们的类型以备后用。当CDI初始化时,JpaRepositoryExtension::afterBeanDiscovery运行并执行正确的bean创建和插入CDI。这在JBoss EAP6.2/6.3/6.4下运行得非常好。

JBoss EAP 7.1html" target="_blank">构建在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。企业注射UnsatisfiedResolutionException:无法解析“javax”的bean。坚持不懈带有限定符[@javax.enterprise.inject.Default(),@javax.enterprise.inject.Any()]的EntityManager。在org。springframework。数据jpa。存储库。cdi。JpaRepositoryExtension。在org上创建repositorybean(JpaRepositoryExtension.java:120)。springframework。数据jpa。存储库。cdi。JpaRepositoryExtension。afterBeanDiscovery(JpaRepositoryExtension.java:96)

有没有人成功地将Spring数据JPA部署到JBoss EAP 7.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 ;
    }

共有2个答案

酆乐湛
2023-03-14

您可以尝试在您的实体管理器中使用/添加一些注释来解决问题。您尝试过吗:
@Produces
@Depant
@Persitence Context
Private EntityManager entityManager;
这可能适用于eap 7.1

卜高超
2023-03-14

我的问题的解决方案是两个小变化:

  • 将@Application ationScoped添加到生产者类。显然WELD不再看到@Producer注解并在没有此项的情况下处理生产者类(我认为),因为默认范围是@Dep郊外。
  • 从createEntityManager(...)生产者方法中删除@Perstemence Context和参数,取而代之的是在其中引用entityManagerFactory。奇怪的是,这甚至适用于早期版本,因为@Perstemence Context“表示对容器管理的EntityManager的依赖关系...”因为该参数是EntityManagerFactory,新WELD对此大加指责。

我的制作人阶级:

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扩展到其他的框架中。接下来让我们看看如何将Spring Data整合到Spring MVC中。

  • 我正在尝试spring-data-r2dbc。我正在Postgresql上尝试这个。我以前尝试过spring data mongodb Responsive。我忍不住把两者都比较了一下。 我看到还不支持查询派生。但我想知道是否有的等价物。这样我就会实时收到数据库更改的通知。Ca任何人都可以共享与此相关的任何代码示例。 我理解底层数据库应该支持这一点。我相信Postgresql确实支持这种使用逻辑解

  • 你尝试实现的类型很可能已经包含在数据类型中. 如果不包括新的数据类型,本手册将说明如何自己编写它. Sequelize 不会在数据库中创建新的数据类型. 本教程说明了如何使 Sequelize 识别新数据类型,并假定这些新数据类型已在数据库中创建. 要扩展 Sequelize 数据类型,请在创建 Sequelize 实例之前进行. 示例 在此示例中,我们将创建一个名为 SOMETYPE 的类型,该

  • 数据类可以扩展密封类,但不是,我不确定它们如何/是否能够接受“supertype”密封类所需的参数。 > 从密封类扩展常规类可以很好地编译。 但是,将其更改为数据类并不编译(“数据类主构造函数必须只具有属性(val/var)参数”)。 否则,我的选择似乎是使用选项1处理我自己的数据类功能(copy、hashcode、equals等),或者通过使用选项4打开超类型属性来进行折衷。

  • 问题内容: 我有一个标准的Spring数据JPA和Spring数据Rest设置,可以正确地将关联返回为指向正确资源的链接。 但是,在 某些 请求中,我希望扩展与“ otherDomain”的关联(因此客户端不必执行N + 1请求即可获取完整数据)。 是否可以配置Spring Data Rest以这种方式处理响应? 问题答案: 默认响应必须保持不变,以确保请求的有效负载与返回的请求对称。但是,Spr

  • 4.将我们的20个工作的整体罐子分解成单独的spring bootüber罐子并不是一项简单的任务--任何想法/想法/最佳实践都不容易实现。 最好的,埃拉德