升级Spring Batch至4.2.4版本后如何修复旧的序列化存储数据
Spring Batch升级后历史XStream序列化数据反序列化失败解决方案
核心结论
可以通过修改原有存储数据解决该问题,同时也提供无需修改数据的兼容方案供你选择。
报错的根本原因是:Spring Batch 4.2+版本默认将执行上下文的序列化器从XStream切换为Jackson,XStream序列化的结果为XML格式,无法被Jackson直接反序列化为Java对象。
方案1:修改历史存储数据适配Jackson序列化
操作步骤如下:
- 先全量备份
batch_job_execution_context表数据,避免操作失误导致数据丢失 - 导出表中所有历史
short_context字段的XML格式内容,若数据量极大可以分批导出 - 编写一次性转换脚本实现转换逻辑:
- 用旧版的XStream序列化器反序列化XML内容,得到原始的上下文Java对象
- 复用Spring Batch 4.2.4内置的Jackson序列化配置(需对齐框架内置的
ObjectMapper对JobParameter等批量内置类的特殊序列化规则),将Java对象序列化为标准JSON格式 - 如果上下文中包含自定义业务类,需要提前给Jackson补充对应的序列化/反序列化配置,比如添加无参构造函数、配置字段序列化规则等
- 将转换后的JSON内容批量更新回表的
short_context字段 - 先小范围验证历史任务的查询、重启等操作无报错后,再全量上线
注意:转换操作期间建议暂停所有批量任务调度,避免新写入的数据和转换操作发生冲突。
方案2:无需修改历史数据的兼容方案(成本更低)
如果你不希望改动历史存储数据,可以直接显式配置Spring Batch沿用XStream序列化器,不需要做任何数据转换:
@Configuration @EnableBatchProcessing public class CustomBatchConfig extends DefaultBatchConfigurer { @Resource private DataSource dataSource; @Resource private PlatformTransactionManager transactionManager; @Override protected JobRepository createJobRepository() throws Exception { JobRepositoryFactoryBean factory = new JobRepositoryFactoryBean(); factory.setDataSource(dataSource); factory.setTransactionManager(transactionManager); // 显式指定使用XStream作为执行上下文序列化器 factory.setSerializer(new XStreamExecutionContextStringSerializer()); factory.afterPropertiesSet(); return factory.getObject(); } }
提示:该方案仅需要修改框架配置,不需要改动历史数据,改造成本极低,适合历史数据量较大、不希望做数据变更的场景。
内容的提问来源于stack exchange,提问作者Bohdan Datsenko
相关产品推荐
相关产品推荐

