如何解决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
相关产品推荐
相关产品推荐

