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

如何解决Spring Batch测试中“java.io.File类不受信任”反序列化错误?

解决Spring Batch端到端测试中java.io.File反序列化不受信任的问题

可能的原因

Spring Batch 5.x(搭配Spring Boot 3.x)默认采用Jackson进行序列化,且默认信任类列表限制严格,java.io.File不在默认信任范围内。若你的Job Execution Context中存储了File对象,就会触发该反序列化错误。

解决方案

1. 避免在Execution Context中存储File对象

最根本的解决方式是不直接将File实例存入Step/Job的Execution Context,改为存储文件路径字符串,使用时再通过路径创建File对象:

// 错误写法:存入File对象
executionContext.put("inputFile", new File("/path/to/file"));

// 正确写法:存入路径字符串
executionContext.put("inputFilePath", "/path/to/file");
// 使用时还原
File inputFile = new File(executionContext.getString("inputFilePath"));

2. 配置Jackson序列化信任java.io.File

若必须保留Execution Context中的File对象,可配置Spring Batch的Jackson序列化器,将java.io.File加入信任列表:

@Configuration
public class BatchConfig {

    @Bean
    public Jackson2ExecutionContextStringSerializer executionContextSerializer() {
        Jackson2ExecutionContextStringSerializer serializer = new Jackson2ExecutionContextStringSerializer();
        ObjectMapper objectMapper = serializer.getObjectMapper();
        // 注册自定义File序列化器,仅序列化文件路径
        objectMapper.registerModule(new SimpleModule().addSerializer(File.class, new FileSerializer()));
        return serializer;
    }

    static class FileSerializer extends StdSerializer<File> {
        public FileSerializer() {
            super(File.class);
        }

        @Override
        public void serialize(File value, JsonGenerator gen, SerializerProvider provider) throws IOException {
            gen.writeString(value.getAbsolutePath());
        }
    }
}

3. 临时切换回JDK序列化(不推荐生产环境)

若从Spring Batch 4.x升级而来,可暂时切换回JDK序列化,但需注意JDK序列化存在安全风险:

# application-test.properties
spring.batch.job.repository.serializer.type=jdk

4. 测试类中单独配置信任类

仅需在测试环境解决时,可在测试类中配置:

@SpringBootTest
public class JobEndToEndTest {

    @Autowired
    private JobLauncherTestUtils jobLauncherTestUtils;

    @Bean
    public Jackson2ExecutionContextStringSerializer testExecutionContextSerializer() {
        Jackson2ExecutionContextStringSerializer serializer = new Jackson2ExecutionContextStringSerializer();
        serializer.getObjectMapper().registerModule(new SimpleModule().addSerializer(File.class, new FileSerializer()));
        return serializer;
    }

    @Test
    void testJobExecution() throws Exception {
        JobExecution jobExecution = jobLauncherTestUtils.launchJob();
        assertEquals(BatchStatus.COMPLETED, jobExecution.getStatus());
    }

    static class FileSerializer extends StdSerializer<File> {
        public FileSerializer() {
            super(File.class);
        }

        @Override
        public void serialize(File value, JsonGenerator gen, SerializerProvider provider) throws IOException {
            gen.writeString(value.getAbsolutePath());
        }
    }
}

验证方式

修改后重新运行端到端测试,检查是否仍出现java.io.File is not trusted错误,同时确认Job执行时Execution Context的序列化/反序列化逻辑正常。

内容的提问来源于stack exchange,提问作者Jeet_dev

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 11:17:01