如何使用 Spring 批处理处理对象列表

Posted

技术标签:

【中文标题】如何使用 Spring 批处理处理对象列表【英文标题】:How to process a List of Objects Using Spring batch 【发布时间】:2020-07-13 03:13:56 【问题描述】:

我正在尝试读取 JSON 文件并读取其值并将其存储在 List<Data> 对象中。 我正在从我的 ItemReader 类中调用 List 并对其进行处理以将其写入数据库。

我的阅读器如下所示:

public class JsonItemReaderFromULProspector implements ItemReader<Data>
//  static String jsonFilePath = Directory.JSON_FILE_PATH;

    private int nextULPIndex;

    public JsonItemReaderFromULProspector() 
         initialize();


    private List<Data> finalULPData;
    private void initialize() 
        List<Data> ulpData=ReadJSONFromULP.getJsonObject();
        for(Data data:ulpData)
            finalULPData=Collections.unmodifiableList(Arrays.asList(data));
            nextULPIndex=0;
        
    

    @Override
    public Data read()throws Exception, UnexpectedInputException, ParseException, NonTransientResourceException 

        Data nextULPData=null;
         if (nextULPIndex < finalULPData.size()) 
             nextULPData = finalULPData.get(nextULPIndex);

             nextULPIndex++;
            

            return nextULPData;
        

    

而我的处理器是一个普通的处理器,它以&lt;Data,ULProspector&gt; 作为输入和输出。

当我尝试将其写入数据库时​​。我只能将一条记录写入数据库,然后它就会退出。

【问题讨论】:

在这种情况下,您的阅读器只返回一个元素。检查您的 read 方法并确保它在返回 null 之前返回多个元素。 【参考方案1】:

而且我相信只有一条您能够将其写入数据库的记录是 JSON 文件中的最后一条记录。

尝试更改这部分代码

for(Data data:ulpData)
            finalULPData=Collections.unmodifiableList(Arrays.asList(data));
            nextULPIndex=0;
        

finalULPData=Collections.unmodifiableList(ulpData);
nextULPIndex=0;        

【讨论】:

出现错误类型不匹配:无法从 List> 转换为 List 是的,你是对的,它是 JSON 中保存在数据库中的最后一条记录。我想保存从第一个开始的所有记录 嗨 Hemant.. 在用建议的代码替换我的代码后,我得到了从 ItemReader 到 Item Processor 的所有记录,但在处理器中出现错误,如下所示 java.lang.NullPointerException: null at com.dksh。 spcrt.processor.ULProspectorDataProcessor.process(ULProspectorDataProcessor.java) ~[classes/:na] at com.dksh.spcrt.processor.ULProspectorDataProcessor.process(ULProspectorDataProcessor.java) ~[classes/:na] at org.springframework.batch。 core.step.item.SimpleChunkProcessor.doProcess(SimpleChunkProcessor.java:134) 建议对 ULProspectorDataProcessor.java 中的 NullPointerException 异常进行调试,或者您可以使用处理器类的代码编辑您的问题。

以上是关于如何使用 Spring 批处理处理对象列表的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Spring MVC 处理未知数量的参数

我如何可互换地处理来自 2 个列表的对象

如何使用需要 2 个参数且其中只有一个参数存储在列表中的查询进行批处理更新

Spring批处理数据读取器在读取项目集合结束时返回额外的空对象?

您将如何使用 Spring Boot 处理仅具有可选查询参数的 REST API?

如何使用 Spring Cloud Task 动态部署独立 Spring 批处理