【问题标题】:Spring-batch ItemProcessor data in the form of a list to modelSpring-batch ItemProcessor 数据以列表的形式进行建模
【发布时间】:2021-08-15 20:17:03
【问题描述】:

我正在使用自定义 itemReader 从外部 rest API 读取数据,它运行良好。但是,当使用 ItemProcessor 将数据处理到我的模型类中时,就会出现问题。不幸的是,API 响应是一个对象,其中嵌套了一个数组,这意味着我必须使用引用另一个类的列表来存储其中的数据。

picture of API response

StockDTO 数据类:

public class StockDTO {

    //  We will change the field data types later when we process the data into our model.
    private String from;
    private String to;
    private List<ProductDTO> products;

    //  Getters and Setters allow RestTemplate to set the data from the external rest API.
    public String getFrom() {
        return from;
    }

    public void setFrom(String from) {
        this.from = from;
    }

    public String getTo() {
        return to;
    }

    public void setTo(String to) {
        this.to = to;
    }

    public List<ProductDTO> getProducts() {
        return products;
    }

    public void setProducts(List<ProductDTO> products) {
        this.products = products;
    }
}

ProductDTO 数据类(列表数据):

public class ProductDTO {

    //  We will change the field data types later when we process the data into our model.
    private String sku;
    private String name;
    private String startDate;

    //  Getters and Setters allow RestTemplate to set the data from the external rest API.
    public String getSku() {
        return sku;
    }

    public void setSku(String sku) {
        this.sku = sku;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getStartDate() {
        return startDate;
    }

    public void setStartDate(String startDate) {
        this.startDate = startDate;
    }
}

模型类:

@Entity
public class Stock {

    @Id
    private long id;
    private int item_from;
    private int item_to;
    private long sku;
    private String name;

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    public int getItem_from() {
        return item_from;
    }

    public void setItem_from(int item_from) {
        this.item_from = item_from;
    }

    public int getItem_to() {
        return item_to;
    }

    public void setItem_to(int item_to) {
        this.item_to = item_to;
    }

    public long getSku() {
        return sku;
    }

    public void setSku(long sku) {
        this.sku = sku;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

ItemProcessor

public class StockDataProcessor implements ItemProcessor<StockDTO, Stock> {

    @Override
    public Stock process(StockDTO stockDTO) throws Exception {

        Stock stock = new Stock();

        stock.setItem_from(Integer.parseInt(stockDTO.getFrom()));
        stock.setItem_to(Integer.parseInt(stockDTO.getTo()));
        //  I'm only able to get the first index sku, name from the list:
        stock.setSku(Long.parseLong(stockDTO.getProducts().get(0).getSku()));
        stock.setName(stockDTO.getProducts().get(0).getName());

        return stock;
    }
}

我应该创建另一个名为 Product 的模型类以便我可以创建 ItemProcessor 还是可以从 ItemProcessor 获取所有列表项而不创建另一个处理器?谢谢。

【问题讨论】:

    标签: list spring-batch processor itemprocessor


    【解决方案1】:

    您可以创建另一个名为 Product 的模型类并修改 Stock 类以包含一个 List 并修改您的 ItemProcessor 以填充 Stock 类中的 Product 列表。

    或者,您可以让 ItemProcessor 返回一个 List 而不是一个 Stock。然后,您的 ItemWriter 将需要处理 List

    【讨论】:

    • 我创建了另一个名为 Product 的模型类,修改了 Stock 类以包含一个 @Transient List,尽管我不确定如何在 ItemProcessor 中填充 List 产品。能否举个例子,谢谢。
    • 我很想将 API 响应格式化为 csv 而不是 json,这样我就不必为嵌套列表创建所有这些额外的类和处理器。我可以简单地使用一个类和一个处理器并将所有数据提取到我的模型中。
    • 如果有人能给我关于如何使用 ItemProcessor 返回列表的建议或建议,我将不胜感激,我一直在阅读官方文档,但我没有看到任何有关返回列表的信息只有单个对象。
    猜你喜欢
    • 2018-12-22
    • 2020-11-15
    • 1970-01-01
    • 2015-09-08
    • 1970-01-01
    • 2020-04-20
    • 2021-12-01
    • 2023-02-10
    • 2011-12-30
    相关资源
    最近更新 更多