Spring-batch данные ItemProcessor в виде списка для моделирования

Я использую настраиваемый itemReader для чтения данных из внешнего API отдыха, и он отлично работает. Однако проблема возникает при обработке данных с помощью ItemProcessor в моем классе модели. К сожалению, ответ API - это объект с вложенным в него массивом, что означает, что я должен использовать список, ссылающийся на другой класс, для хранения данных внутри него.

изображение ответа API

Класс данных 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 <StockDTO, Stock>

      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 <ProductDTO, Product>, или я могу получить все элементы списка из ItemProcessor <StockDTO, Stock> без создания другого процессора? Спасибо.

1 ответ

Вы можете создать другой класс модели под названием Product и изменить класс Stock, чтобы включить List, и изменить свой ItemProcessor, чтобы заполнить список Product в классе Stock.

В качестве альтернативы вы можете заставить свой ItemProcessor возвращать список, а не только одну Stock. Затем вашему ItemWriter потребуется обработать List <List>.

Другие вопросы по тегам