首页 > 解决方案 > 将 Spring Batch Java 项目的 spring-boot/spring-framework 升级到 2.xx/5.xx,现在数据未写入/保存到数据库 (Postgresql)

问题描述

我最近将我的 Spring Batch Java 应用程序从升级/迁移spring-boot-starter-parent-1.5.9.RELEASE到 -> spring-boot-starter-parent-2.2.4.RELEASE,随后引入了 5.XX(准确地说是 5.2.3.RELEASE)springframework 依赖项(在我使用 4.XX 之前)。我正在使用的一些主要是:

spring-boot-starter-parent-2.2.4
spring-boot-starter-batch
spring-boot-starter-jpa
spring-boot-starter-web
hibernate-core
hibernate-envers
hibernate-entitymanager
postgresql

对于上下文,我的应用程序读取 .csv 文件并解析数据,然后将其简单地写入 postgresql 数据库。

经过今天几个小时的调试,我知道我第一次调用将数据写入数据库,这是saveAll()由一个名为JdkDynamicAopProxyClass当它从 Spring AOP 库进入时以前,我正在使用该save()方法,但是一旦我升级了我的依赖项,它就不再起作用了。

我知道它在这里失败了,因为我进行了细致的调试,发现一旦它saveAll()在我的 java 类中实现了ItemWriter<S>for Spring Batch 的方法,它就会进入 中的public Object invoke(Object proxy, Method method, Object[] args)方法JdkDynamicAopProxyClass,并最终抛出异常,在难以理解的库代码。

如前所述,我还调试了运行时正在运行的旧应用程序,并且我看到当它到达该方法时(我在上面提到过),它返回要写入的实体的 ArrayList(这是正确的)数据库在该方法中遇到这行代码时:spring-boot-starter-1.5.9public Object invoke()

public Object invoke(Object proxy, Method method, Object[] args) {
   // code here...

   // this is where I notice a difference in return type from the "working" code vs. "broken 
   // code"
    retVal = invocation.proceed();

  // more code here...

  Object var12 = retVal;
  return var12;

但是,当我调试我的新迁移代码(升级到 spring 2.XX/5.XX 时,我看到它返回一个DefaultTransactionStatus@14037对象,这显然是错误的。然后它从库protected TransactionAspectSupport.TransactionInfo createTransactionIfNecessary()中进入类中的方法。然后让我上面提到的方法中的变量等于,它将开始循环几次,在一个圆圈的相同部分代码上。它将设置为。我可以单击 IntelliJ 中的“Step Into”按钮,然后它会让我永远跨过去。它就像一个无限循环。TransactionAspectSupportspring-txretValinvokenulltxInfoPROPAGATION_REQUIRES_NEW,ISOLATION_SERIALIZABLE

我不确定要发布什么,或者这里是否有任何线索。我用谷歌搜索并发现其他人有类似的问题,它似乎围绕(可能)事务管理器或实体管理器以及如何在配置类中设置 Bean。

我尝试了我阅读的所有内容,但没有任何效果。我不是 Spring Batch 或 Spring 的专家,所以也许我在这里遗漏了一些东西。

我还注意到,当我调试我的工作代码时,它有一个变量Target = SimpleJpaRepository@11243,它有一些属性,比如 ArrayList of Providers

 Em = Shared EntityManager proxy for target factory [org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean@6f2b608e]
 Provider = HIBERNATE
 org.hibernate.Session [0]
 org.hibernate.jpa.HibernateEntityManager [1]
 org.hibernate.ejb.HibernateEntityManager [2]

奇怪的是,当我调试我的“损坏”代码时,它似乎只有org.hibernate.jpa.HibernateEntityManager在这个变量的列表中

如果有人可以请让我知道是否有一些指向某事的线索,我将非常感激。我真的认为它是一个 Bean 配置、实体管理器/事务问题,但我不是专家,所以我不确定。起初我认为这是一个依赖问题,但在谷歌上之后改变了我的想法。

标签: javaspringspring-boothibernatespring-batch

解决方案


推荐阅读