我们的处理器返回List<?>(有效传递a List<List<?>>)到我们的ItemWriter.
现在,我们观察到JdbcBatchItemWriter没有编程处理item instanceof List.我们还观察到了处理项目instanceof List; 我们需要写一个自定义ItemSqlParameterSourceProvider.
但令人遗憾的是,它返回的SqlParameterSource只能处理一个item并且再也无法处理一个List.
那么,有人可以帮助我们了解如何处理列表中的列表JdbcBatchItemWriter吗?
Dea*_*ark 15
通常,设计模式是:
Reader -> reads something, returns ReadItem
Processor -> ingests ReadItem, returns ProcessedItem
Writer -> ingests List<ProcessedItem>
Run Code Online (Sandbox Code Playgroud)
如果您的处理器正在返回List<Object>,那么您需要您的Writer期待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;
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7421 次 |
| 最近记录: |