使用带有列表列表的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 extends 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; } }