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

Spring Batch读取S3桶文件报错:Input resource must exist 解决方案

解决Spring Batch读取S3文件的报错问题

错误原因分析

报错提示把S3路径识别成了ServletContext resource,说明当前使用的资源加载器默认是Web应用的上下文资源加载器,无法识别S3协议的路径,导致无法正确定位S3上的文件。

解决方案

方法一:使用Spring Cloud AWS的S3资源加载器

  • 首先引入Spring Cloud AWS的相关依赖(以Maven为例):
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-aws</artifactId>
        <version>2.2.6.RELEASE</version> <!-- 请使用与你的Spring版本适配的版本 -->
    </dependency>
    
  • 在配置Reader时,通过ResourceLoader获取S3资源,或者直接使用S3Resource:
    @Autowired
    private ResourceLoader resourceLoader;
    
    @Bean
    public FlatFileItemReader<YourEntity> s3FileReader() {
        return new FlatFileItemReaderBuilder<YourEntity>()
                .name("s3FileReader")
                .resource(resourceLoader.getResource("s3://bkt-csv-files/files/23-12-2022/arquivo_jan_2022_pt_00"))
                .lineMapper(new DefaultLineMapper<>() {{
                    setLineTokenizer(new DelimitedLineTokenizer() {{
                        setNames("field1", "field2"); // 替换为你的实际字段名
                    }});
                    setFieldSetMapper(new BeanWrapperFieldSetMapper<>() {{
                        setTargetType(YourEntity.class);
                    }});
                }})
                .build();
    }
    
    这里的ResourceLoader会自动识别s3://协议,正确加载S3上的文件资源。

方法二:使用Spring Batch专用的S3读取组件

如果项目已经集成Spring Cloud AWS,可以直接使用S3ItemReader来读取S3文件,它专门针对S3存储做了适配:

@Bean
public S3ItemReader<YourEntity> s3ItemReader(S3Client s3Client) {
    return new S3ItemReaderBuilder<YourEntity>()
            .s3Client(s3Client)
            .bucket("bkt-csv-files")
            .key("files/23-12-2022/arquivo_jan_2022_pt_00")
            .lineMapper(new DefaultLineMapper<>() {{
                setLineTokenizer(new DelimitedLineTokenizer() {{
                    setNames("field1", "field2"); // 替换为你的实际字段名
                }});
                setFieldSetMapper(new BeanWrapperFieldSetMapper<>() {{
                    setTargetType(YourEntity.class);
                }});
            }})
            .build();
}

临时应急方案(不推荐)

如果只是临时跳过资源存在性检查,可以关闭Reader的strict模式,但这无法解决资源无法访问的根本问题,仅用于调试:

new FlatFileItemReaderBuilder<YourEntity>()
        // ... 其他配置项
        .strict(false)
        .build();

内容的提问来源于stack exchange,提问作者Rafael Bernardes Lima

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 03:20:16