当前位置: 首页 > 面试题库 >

Spring Batch-将ItemWriter与列表列表一起使用

易衡
2023-03-14
问题内容

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

现在,我们观察到JdbcBatchItemWriter尚未编程处理item instanceof List。我们还观察到处理instanceInstanceof
List;我们需要编写一个自定义ItemSqlParameterSourceProvider

但可悲的是,它返回SqlParameterSource只能处理一个item,又不能处理a 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;
    }

}


 类似资料:
  • 如何将Restrictions.in与列表字段一起使用? 这是我的模型: 我尝试只获取具有某些功能的组: 但这会返回一个错误: 引起原因:org.hibernate.exception.GenericJDBCExc0019:在索引:: 1缺少IN或OUT参数org.hibernate.exception.internal.在org.hibernate.engine.jdbc.spi.SqlExce

  • 问题内容: 我在Python2.6.5中构造了一个字符串,该字符串将具有不同数量的标记,这些标记与list中的条目数匹配。我需要写出格式化的字符串。以下内容不起作用,但表示我要执行的操作。在此示例中,有三个标记,并且列表具有三个条目。 我希望输出字符串为: 问题答案: print s % tuple(x) 代替

  • 我正在尝试为java应用程序制作一个表单。它包含一个带有用户列表的组合框。假设我有一个类教授,有3个属性。Id是“唯一的”,这是数据库所必需的。 我认为最用户友好的选项是在组合框中填写“教授”类的姓氏和名字,这就是我所做的。但是现在我不知道如何取回教授对象。 就像我说的,我用姓氏、空格和名字填充了组合框,但是一旦用户选择了教授,我不知道如何选择用户选择的教授。 有什么方法可以在Combobox中放

  • 鉴于 我有一个对象列表。 看起来像 我想将此转换为 i、 e.将个人类别整理成类别列表。 这是实现我想要的当前代码。 有什么方法可以使用流来做到这一点吗 这个问题在本质上类似于Group by和sum对象,比如SQLJavalambdas?但对我没有帮助,因为这里完成了聚合,而这里不是聚合。

  • 我正在为一个项目使用JDBI / Dropwizard,希望运行一些简单的查询。我有这样一个疑问: 我在方法中绑定变量,如下所示: 但是,运行时出现以下错误: 我将作为字符串类型的 传递,所以我有点困惑这里发生了什么。有谁JDBI的正确方法?

  • 问题内容: 有什么方法可以将列表项与参数一起映射到函数。我有一个清单: 而且我必须调用与每个列表元素相对应的函数以及其他参数,以便可以计算以下内容 等等… 有什么优雅的方法可以做到这一点吗?我是新手,所以请不要介意。 问题答案: 使用列表理解: