spring-batch – 使用带有列表列表的ItemWriter

我们的处理器返回一个List(有效地将List< List<?>>)传递给我们的ItemWriter.现在,我们观察到JdbcBatchItemWriter未编程为处理项目实例列表.我们还观察到处理项目实例列表;我们需要编写一个自定义的ItemSqlParameterSourceProvider.但令人遗憾的是它返回SqlParameterSource,它只能处理一个对象,并且无法处理List.因此,有人可以帮助我们了解如何处理JdbcBatchItemWriter中的列表列表.
最佳答案
通常,设计模式是:

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

如果您的处理器返回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;
    }

}

转载注明原文:spring-batch – 使用带有列表列表的ItemWriter - 代码日志