未定义数据源的带有 JPA 的 SpringBatchTest

问题描述

似乎 @SpringBatchTest 要求使用 dataSoruce bean,但我的 JPA 在 persistence.xml 中定义如下:

<persistence-unit name="MysqL" transaction-type="RESOURCE_LOCAL">
    <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
    <shared-cache-mode>ENABLE_SELECTIVE</shared-cache-mode>
    <properties>
      <property name="hibernate.connection.driver_class" value="com.MysqL.cj.jdbc.Driver"/>
      <property name="hibernate.connection.url" value="jdbc:MysqL://db/data"/>
      <property name="hibernate.connection.provider_class" value="org.hibernate.hikaricp.internal.HikariCPConnectionProvider"/>
      <property .../>
</persistence-unit>

而且我似乎无法从这个 persistence.xml

获取数据源

XML 内容 (data-core.xml) :

  <bean id="emfData" class="org.springframework.orm.jpa.LocalContainerEntityManagerfactorybean">
    <property name="persistenceUnitName" value="MysqL"/>
  </bean>

  <bean id="txMGrdata" class="org.springframework.orm.jpa.JpaTransactionManager">
    <property name="entityManagerFactory" ref="emfData"/>
  </bean>

  <tx:annotation-driven transaction-manager="txMGrdata"/>

  <jpa:repositories base-package="destiny.data"
                    entity-manager-factory-ref="emfData"
                    transaction-manager-ref="txMGrdata"
  />

代码如下:

@Configuration
@ImportResource("classpath:/data-core.xml")
class DataSourceConfig {

  @PersistenceContext(unitName = "MysqL")
  private lateinit var em : EntityManager

  @Inject
  @Qualifier("emfData")
  private lateinit var emfData : EntityManagerFactory

  @Primary
  @Bean
  fun dataSource(): DataSource {

    logger.info("emfData = {}",emfData)
    return em.entityManagerFactory.let { emf ->
      logger.info("em.emf = {}",emf)
      val emfInfo = (emf as EntityManagerFactoryInfo)
      logger.info("emfInfo = {}",emfInfo)
      logger.info("emfInfo.dataSource = {}",emfInfo.dataSource)
      emfInfo.dataSource!!
    }
  }

  companion object {
    val logger = KotlinLogging.logger {  }
  }
}

输出

emfData = org.springframework.orm.jpa.LocalContainerEntityManagerfactorybean@102c24d1
em.emf = org.springframework.orm.jpa.LocalContainerEntityManagerfactorybean@102c24d1
emfInfo = org.springframework.orm.jpa.LocalContainerEntityManagerfactorybean@102c24d1
emfInfo.dataSource = null

好的,dataSource 现在为空。初始化 JobConfig implements DefaultBatchConfigurer 时会抛出 NPE :

  @Inject
  override fun setDataSource(dataSource: DataSource) {
    logger.info("setting dataSource to {}",dataSource)
    super.setDataSource(dataSource)
  }

我该怎么办?

有没有办法直接使用 entityManager / entityManagerFactory 测试 SpringBatch,而无需任何预定义的 dataSource bean ?

(这不是 spring-boot 环境)

谢谢。

(春季批次 4.3.1,春季批次 5.2.9)

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)