Spring Batch中AggregateItemReader初始化及类型转换异常问题
Spring Batch 多行聚合读取问题解决
异常原因分析
你遇到的ClassCastException是因为类型不匹配:你的gsmfFlatReader返回的是读取单条String行的FlatFileItemReader<String>,但错误地将它赋值给了声明为ItemStreamReader<AggregateItem<T>>的字段——String无法直接转换为AggregateItem类型。
核心逻辑修正
AggregateItemReader的作用是将多个基础元素(这里就是文本行String)聚合包装成AggregateItem对象,因此它内部依赖的应该是读取单个基础元素的读取器,而非直接读取AggregateItem的读取器。
1. 修正AggregateItemReader的泛型与内部字段
确保你的AggregateItemReader内部读取器类型为ItemStreamReader<T>(T为单个元素类型,这里是String):
public class AggregateItemReader<T> implements ItemStreamReader<AggregateItem<T>> { // 改为读取单个基础元素的读取器 private ItemStreamReader<T> itemReader; // 可配置聚合行数,或自定义聚合规则 private int aggregateCount; @Override public AggregateItem<T> read() throws Exception { List<T> aggregatedItems = new ArrayList<>(); for (int i = 0; i < aggregateCount; i++) { T item = itemReader.read(); if (item == null) { break; } aggregatedItems.add(item); } // 没有聚合到元素时返回null,触发批处理结束 return aggregatedItems.isEmpty() ? null : new AggregateItem<>(aggregatedItems); } // setter方法 public void setItemReader(ItemStreamReader<T> itemReader) { this.itemReader = itemReader; } public void setAggregateCount(int aggregateCount) { this.aggregateCount = aggregateCount; } }
2. 正确初始化聚合读取器
将你的FlatFileItemReader<String>作为底层读取器注入到AggregateItemReader中,并配置聚合规则(比如固定行数):
@Bean public AggregateItemReader<String> aggregateGsmfReader() { AggregateItemReader<String> aggregateReader = new AggregateItemReader<>(); // 注入你已有的单行读取器 aggregateReader.setItemReader(gsmfFlatReader()); // 配置每N行聚合一次,根据业务需求调整 aggregateReader.setAggregateCount(3); return aggregateReader; } @Bean public FlatFileItemReader<String> gsmfFlatReader() { return new FlatFileItemReaderBuilder<String>() .name("GSMF_READER") .lineMapper((line, index) -> line) .build(); }
3. 处理器适配
你的处理器需要接收AggregateItem<String>类型,从中取出聚合后的List<String>进行处理:
public class GsmfProcessor implements ItemProcessor<AggregateItem<String>, YourResultType> { @Override public YourResultType process(AggregateItem<String> item) throws Exception { List<String> lines = item.getItems(); // 执行你的业务处理逻辑 return ...; } }
内容的提问来源于stack exchange,提问作者Vinod
相关产品推荐
相关产品推荐

