Spring Batch 5:失败原因:java.time.format.DateTimeParseException:无法在索引 0 处解析文本“日期”

问题描述 投票:0回答:1

最近,我使用 Spring 5.1.2 将我们的应用程序迁移到了 java 17,因此 Spring 批处理也从 v4 迁移到了 v5。

按照指南中所述进行了必要的更改。

但是,在第一次运行期间,Spring框架将开始正确地将数据插入批处理表中,但由于应用程序级别问题(某些crt问题)而失败。

因此,在更正 crt 后,如果我尝试运行该应用程序,则会失败并出现以下错误:

org.springframework.core.convert.ConversionFailedException:无法将值 [date] 从类型 [java.lang.String] 转换为类型 [java.util.Date]

原因:java.time.format.DateTimeParseException:无法在索引 0 处解析文本“日期”

下面的查询在 Spring Batch 中使用: https://github.com/spring-projects/spring-batch/wiki/Spring-Batch-5.0-Migration-Guide?secureweb=Teams&secureweb=Teams&secureweb=Teams#column-change-in-batch_job_execution_params

选择作业_执行_ID、参数_名称、参数_类型、参数_值、识别 来自 BDB_DBA.BATCH_JOB_EXECUTION_PARAMS 哪里 JOB_EXECUTION_ID = ?

完整堆栈跟踪:

2024-09-26 22:18:12,809 [main] (JdbcTemplate.java:721) DEBUG org.springframework.jdbc.core.JdbcTemplate - Executing prepared SQL query
2024-09-26 22:18:12,810 [main] (JdbcTemplate.java:650) DEBUG org.springframework.jdbc.core.JdbcTemplate - Executing prepared SQL statement [SELECT JOB_EXECUTION_ID, PARAMETER_NAME, PARAMETER_TYPE, PARAMETER_VALUE, IDENTIFYING
FROM BDB_DBA.BATCH_JOB_EXECUTION_PARAMS
WHERE JOB_EXECUTION_ID = ?
]
2024-09-26 22:18:12,810 [main] (StatementCreatorUtils.java:237) TRACE org.springframework.jdbc.core.StatementCreatorUtils - Setting SQL statement parameter value: column index 1, parameter value [0], value class [java.lang.Long], SQL type unknown
2024-09-26 22:18:13,058 [main] (TransactionAspectSupport.java:676) TRACE org.springframework.transaction.interceptor.TransactionInterceptor - Completing transaction for [org.springframework.batch.core.repository.support.SimpleJobRepository.getLastJobExecution] after exception: org.springframework.core.convert.ConversionFailedException: Failed to convert from type [java.lang.String] to type [java.util.Date] for value [date]
2024-09-26 22:18:13,058 [main] (AbstractPlatformTransactionManager.java:893) DEBUG org.springframework.jdbc.datasource.DataSourceTransactionManager - Initiating transaction rollback
2024-09-26 22:18:13,058 [main] (DataSourceTransactionManager.java:349) DEBUG org.springframework.jdbc.datasource.DataSourceTransactionManager - Rolling back JDBC transaction on Connection [HikariProxyConnection@1130153977 wrapping oracle.jdbc.driver.T4CConnection@6c008c24]
2024-09-26 22:18:13,301 [main] (DataSourceUtils.java:243) DEBUG org.springframework.jdbc.datasource.DataSourceUtils - Resetting isolation level of JDBC Connection [HikariProxyConnection@1130153977 wrapping oracle.jdbc.driver.T4CConnection@6c008c24] to 2
2024-09-26 22:18:13,544 [main] (DataSourceTransactionManager.java:393) DEBUG org.springframework.jdbc.datasource.DataSourceTransactionManager - Releasing JDBC Connection [HikariProxyConnection@1130153977 wrapping oracle.jdbc.driver.T4CConnection@6c008c24] after transaction
2024-09-26 22:18:13,549 [main] (Application.java:59) ERROR com.jpmorgan.multisource.matureassets.application.Application - Fatal Error
org.springframework.core.convert.ConversionFailedException: Failed to convert from type [java.lang.String] to type [java.util.Date] for value [date]
    at org.springframework.core.convert.support.ConversionUtils.invokeConverter(ConversionUtils.java:47) ~[spring-core-6.1.11.jar:6.1.11]
    at org.springframework.core.convert.support.GenericConversionService.convert(GenericConversionService.java:182) ~[spring-core-6.1.11.jar:6.1.11]
    at org.springframework.core.convert.support.GenericConversionService.convert(GenericConversionService.java:165) ~[spring-core-6.1.11.jar:6.1.11]
    at org.springframework.batch.core.repository.dao.JdbcJobExecutionDao.lambda$getJobParameters$2(JdbcJobExecutionDao.java:475) ~[spring-batch-core-5.1.2.jar:5.1.2]
    at org.springframework.jdbc.core.JdbcTemplate$RowCallbackHandlerResultSetExtractor.extractData(JdbcTemplate.java:1762) ~[spring-jdbc-6.1.11.jar:6.1.11]
    at org.springframework.jdbc.core.JdbcTemplate$1.doInPreparedStatement(JdbcTemplate.java:733) ~[spring-jdbc-6.1.11.jar:6.1.11]
    at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:658) ~[spring-jdbc-6.1.11.jar:6.1.11]
    at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:723) ~[spring-jdbc-6.1.11.jar:6.1.11]
    at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:754) ~[spring-jdbc-6.1.11.jar:6.1.11]
    at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:783) ~[spring-jdbc-6.1.11.jar:6.1.11]
    at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:799) ~[spring-jdbc-6.1.11.jar:6.1.11]
    at org.springframework.batch.core.repository.dao.JdbcJobExecutionDao.getJobParameters(JdbcJobExecutionDao.java:484) ~[spring-batch-core-5.1.2.jar:5.1.2]
    at org.springframework.batch.core.repository.dao.JdbcJobExecutionDao$JobExecutionRowMapper.mapRow(JdbcJobExecutionDao.java:510) ~[spring-batch-core-5.1.2.jar:5.1.2]
    at org.springframework.batch.core.repository.dao.JdbcJobExecutionDao$JobExecutionRowMapper.mapRow(JdbcJobExecutionDao.java:495) ~[spring-batch-core-5.1.2.jar:5.1.2]
    at org.springframework.jdbc.core.RowMapperResultSetExtractor.extractData(RowMapperResultSetExtractor.java:94) ~[spring-jdbc-6.1.11.jar:6.1.11]
    at org.springframework.jdbc.core.RowMapperResultSetExtractor.extractData(RowMapperResultSetExtractor.java:61) ~[spring-jdbc-6.1.11.jar:6.1.11]
    at org.springframework.jdbc.core.JdbcTemplate$1.doInPreparedStatement(JdbcTemplate.java:733) ~[spring-jdbc-6.1.11.jar:6.1.11]
    at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:658) ~[spring-jdbc-6.1.11.jar:6.1.11]
    at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:723) ~[spring-jdbc-6.1.11.jar:6.1.11]
    at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:754) ~[spring-jdbc-6.1.11.jar:6.1.11]
    at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:767) ~[spring-jdbc-6.1.11.jar:6.1.11]
    at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:825) ~[spring-jdbc-6.1.11.jar:6.1.11]
    at org.springframework.batch.core.repository.dao.JdbcJobExecutionDao.getLastJobExecution(JdbcJobExecutionDao.java:342) ~[spring-batch-core-5.1.2.jar:5.1.2]
    at org.springframework.batch.core.repository.support.SimpleJobRepository.getLastJobExecution(SimpleJobRepository.java:303) ~[spring-batch-core-5.1.2.jar:5.1.2]
    at jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:?]
    at jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[?:?]
    at jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:?]
    at java.lang.reflect.Method.invoke(Method.java:568) ~[?:?]
    at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:354) ~[spring-aop-6.1.11.jar:6.1.11]
    at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:196) ~[spring-aop-6.1.11.jar:6.1.11]
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) ~[spring-aop-6.1.11.jar:6.1.11]
    at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:379) ~[spring-tx-6.1.11.jar:6.1.11]
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:119) ~[spring-tx-6.1.11.jar:6.1.11]
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) ~[spring-aop-6.1.11.jar:6.1.11]
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:223) ~[spring-aop-6.1.11.jar:6.1.11]
    at jdk.proxy2.$Proxy35.getLastJobExecution(Unknown Source) ~[?:?]
    at org.springframework.batch.core.launch.support.SimpleJobLauncher.run(SimpleJobLauncher.java:111) ~[spring-batch-core-5.1.2.jar:5.1.2]
Caused by: java.time.format.DateTimeParseException: Text 'date' could not be parsed at index 0

BATCH_JOB_EXECUTION_PARAMS 表的图像: 在此输入图片描述

无法理解根本原因是什么,因为我们没有手动更新任何内容。 Spring 批处理框架会处理一切。

对于表创建: https://github.com/spring-projects/spring-batch/blob/main/spring-batch-core/src/main/resources/org/springframework/batch/core/schema-oracle.sql

即使之前的作业处于失败状态,它也应该正常工作

<bean id="jobRepository"
      class="org.springframework.batch.core.repository.support.JobRepositoryFactoryBean">
    <property name="dataSource" ref="dataSourceHikari"/>
    <property name="transactionManager" ref="transactionManager"/>
    <property name="databaseType" value="oracle"/>
    <property name="tablePrefix" value="BATCH_"/>
</bean>

<bean id="jobLauncher"
          class="org.springframework.batch.core.launch.support.SimpleJobLauncher">
        <property name="jobRepository" ref="jobRepository"/>
    </bean>

 <bean id="taskExecutor"
          class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor" scope="job">
        <property name="queueCapacity" value="100"/>
        <property name="maxPoolSize" value="30"/>
        <property name="corePoolSize" value="10"/>
    </bean>
spring spring-boot spring-batch spring-batch-admin spring-batch-integration
1个回答
0
投票

在您共享的屏幕截图中,我看到参数

runTime
的值是字符串文字
date
。这意味着作业是用像
runTime=date
这样的参数启动的,这显然是不正确的。

我建议您将参数类型从

java.lang.String
更改为
java.time.LocalDate
并在启动时传递正确的日期值。

Spring Batch 默认情况下已经注册了一个

LocalDate
到/来自
String
转换器。

© www.soinside.com 2019 - 2024. All rights reserved.