【问题标题】:How to iterate over StaxEventItemReader/itemreader?如何迭代 StaxEventItemReader/itemreader?
【发布时间】:2021-10-25 02:47:00
【问题描述】:

目前我想访问 StaxEventItemReader 中的对象。这是通过使用 StaxEventItemReader.read() 完成的(xml 文件有 50 个对象/项目),所以我可以对这些对象做一些事情。

问题是如何正确迭代 StaxEventItemReader 的项目?

原来我是这样的:

while (objectStaxEventItemReader.read() != null) {
    invokeRandomMethod(objectStaxEventItemReader.read());
}

问题在于 read() “读取一段输入数据并前进到下一个”(Doc)。 所以最后只处理了 25 个项目,因为空检查也推进了“迭代器”。 所以空检查似乎是不可能的。

目前我只有一个临时解决方案(使用for循环):

for (int i = 0; i < 50; i++) {
    invokeRandomMethod(objectStaxEventItemReader.read());
}

读取所有 50 个对象,但这不是一个令人满意的解决方案,因为我必须指定有 50 个元素。

我环顾四周,发现 PeekableItemReader (Doc) 的 peek 方法可能有用,但它是 itemreader 的子接口,所以我不能将它与仅实现 itemreader 的 StaxEventItemReader 一起使用。

有没有办法检查 null 或更好的方法来迭代 StaxEventItemReader 而无需指定元素的数量?

【问题讨论】:

    标签: java spring spring-boot spring-batch


    【解决方案1】:
    var sentinel = objectStaxEventItemReader.read();
    
    while(sentinel != null) {
        invokeRandomMethod(sentinel);
        sentinel = objectStaxEventItemReader.read();
    }
    

    将返回值保存在变量中并检查其是否为空。

    【讨论】:

    • 奇怪。您的解决方案在纸上似乎是正确的,但是由于某种原因,当我这样做时,读取的对象多于存在的对象,例如我在 xml 中有两个 car 类型的对象,这两个对象被正确读取,但是对于某些原因我还从 StaxEventItemReader 读取了 40 个 car 类型的附加对象(所有属性为 null)。不确定这是否是我不知道的 StaxEventItemReader 的行为,我猜这个问题之前没有出现,因为我手动指定了何时停止阅读。
    • @TomSteger 如果您需要更多帮助,您将不得不提供更多上下文
    • 我想现在很好。您上面的简单解决方案效果很好,谢谢。由于我在 spring 批处理流程之外使用 StaxEventItemReader,因此必须处理一些额外的事情。读取数据后,StaxEventItemReader 似乎也有多个对象,所有属性都设置为 null。现在我只是在将它传递给方法之前检查它是否是一个“空对象”。
    猜你喜欢
    • 2021-10-22
    • 1970-01-01
    • 1970-01-01
    • 2014-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-06
    • 2016-04-09
    相关资源
    最近更新 更多