我们的处理器将一个List<?>(有效地传递List<List<?>>)返回给我们ItemWriter。
List<?>
List<List<?>>
ItemWriter
现在,我们观察到JdbcBatchItemWriter尚未编程处理item instanceof List。我们还观察到处理instanceInstanceof List;我们需要编写一个自定义ItemSqlParameterSourceProvider。
JdbcBatchItemWriter
item instanceof List
List
ItemSqlParameterSourceProvider
但可悲的是,它返回时SqlParameterSource只能处理一个item,又不能处理a List。
SqlParameterSource
item
因此,有人可以帮助我们了解如何处理中的列表JdbcBatchItemWriter吗?
通常,设计模式为:
Reader -> reads something, returns ReadItem Processor -> ingests ReadItem, returns ProcessedItem Writer -> ingests List<ProcessedItem>
如果处理器返回List<Object>,则需要Writer期望List<List<Object>>。
List<Object>
List<List<Object>>
您可以通过将您JdbcBatchItemWriter的委托包装在看起来像这样的ItemWriter中来实现:
public class ListUnpackingItemWriter<T> implements ItemWriter<List<T>>, ItemStream, InitializingBean { private ItemWriter<T> delegate; @Override public void write(final List<? extends List<T>> lists) throws Exception { final List<T> consolidatedList = new ArrayList<>(); for (final List<T> 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<T> delegate) { this.delegate = delegate; } }