如何使用Jackson2ExecutionContextStringSerializer添加信任类解决UUID反序列化报错
Spring Batch UUID反序列化失败问题解决方案
问题根因
- 自定义
ExecutionContextSerializerBean未绑定到JobRepository,Spring Batch默认不会自动拾取该自定义Bean - 仅传入
java.util.UUID作为受信任类会覆盖Spring Batch默认的受信任包列表,默认列表包含java.util.*、java.time.*等常用包,覆盖后会导致集合、时间类反序列化异常
正确配置方案
方案1:全局配置序列化器(推荐)
重写DefaultBatchConfigurer的createJobRepository方法,手动绑定自定义序列化器,同时保留默认受信任包前缀:
import org.springframework.batch.core.configuration.annotation.DefaultBatchConfigurer; import org.springframework.batch.core.repository.JobRepository; import org.springframework.batch.core.repository.support.JobRepositoryFactoryBean; import org.springframework.batch.item.ExecutionContextSerializer; import org.springframework.batch.item.support.Jackson2ExecutionContextStringSerializer; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.transaction.PlatformTransactionManager; import javax.sql.DataSource; @Configuration public class CustomBatchConfig extends DefaultBatchConfigurer { private final DataSource dataSource; private final PlatformTransactionManager transactionManager; public CustomBatchConfig(DataSource dataSource, PlatformTransactionManager transactionManager) { this.dataSource = dataSource; this.transactionManager = transactionManager; } @Override protected JobRepository createJobRepository() throws Exception { JobRepositoryFactoryBean factory = new JobRepositoryFactoryBean(); factory.setDataSource(dataSource); factory.setTransactionManager(transactionManager); // 绑定自定义序列化器 factory.setSerializer(customExecutionContextSerializer()); factory.afterPropertiesSet(); return factory.getObject(); } @Bean public ExecutionContextSerializer customExecutionContextSerializer() { // 保留默认受信任包前缀,追加需要的自定义类/包 return new Jackson2ExecutionContextStringSerializer( // Spring Batch默认受信任前缀,不可省略 "java.util.", "java.time.", "org.springframework.batch.item.", "org.springframework.batch.core.", // 自定义受信任类 "java.util.UUID" // 如有其他业务类需要序列化,可继续追加类全限定名或包前缀 ); } }
方案2:字段级注解配置
如果仅少量字段涉及UUID序列化,无需修改全局配置,直接给对应字段添加Jackson序列化/反序列化注解即可:
import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.fasterxml.jackson.databind.annotation.JsonSerialize; import com.fasterxml.jackson.datatype.jsr310.deser.UUIDDeserializer; import com.fasterxml.jackson.datatype.jsr310.ser.UUIDSerializer; import java.util.UUID; public class YourBusinessObj { @JsonSerialize(using = UUIDSerializer.class) @JsonDeserialize(using = UUIDDeserializer.class) private UUID taskId; // 其余字段、getter/setter省略 }
配置验证
配置完成后重新运行任务,UUID和集合类的反序列化异常会同时解决。
内容的提问来源于stack exchange,提问作者WillyM
相关产品推荐
相关产品推荐

