使用带有列表列表的ItemWriter

我们的处理器返回List (有效地将List<List>传递给)我们的ItemWriter

现在,我们观察到JdbcBatchItemWriter未编程为处理item instanceof List 。 我们还观察到处理项目实例List ; 我们需要编写一个自定义的ItemSqlParameterSourceProvider

但令人遗憾的是它返回SqlParameterSource ,它只能处理一个item并且无法处理List

那么,有人可以帮助我们了解如何处理JdbcBatchItemWriter中的列表列表吗?

通常,设计模式是:

 Reader -> reads something, returns ReadItem Processor -> ingests ReadItem, returns ProcessedItem Writer -> ingests List 

如果您的处理器正在返回List ,那么您需要Writer期望List>

您可以通过将JdbcBatchItemWriter包装为JdbcBatchItemWriter中的委托来实现此目的,如下所示:

 public class ListUnpackingItemWriter implements ItemWriter>, ItemStream, InitializingBean { private ItemWriter delegate; @Override public void write(final List> lists) throws Exception { final List consolidatedList = new ArrayList<>(); for (final List list : lists) { consolidatedList.addAll(list); } delegate.write(consolidatedList); } @Override public void afterPropertiesSet() { Assert.notNull(delegate, "You must set a delegate!"); } @Override public void open(ExecutionContext executionContext) { if (delegate instanceof ItemStream) { ((ItemStream) delegate).open(executionContext); } } @Override public void update(ExecutionContext executionContext) { if (delegate instanceof ItemStream) { ((ItemStream) delegate).update(executionContext); } } @Override public void close() { if (delegate instanceof ItemStream) { ((ItemStream) delegate).close(); } } public void setDelegate(ItemWriter delegate) { this.delegate = delegate; } }