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
相关产品推荐
相关产品推荐

