You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Jackson2ExecutionContextStringSerializer添加信任类解决UUID反序列化报错

Spring Batch UUID反序列化失败问题解决方案

问题根因

  • 自定义ExecutionContextSerializer Bean未绑定到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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.14 14:36:08