Spring-batch данные ItemProcessor в виде списка для моделирования
Я использую настраиваемый itemReader для чтения данных из внешнего API отдыха, и он отлично работает. Однако проблема возникает при обработке данных с помощью ItemProcessor в моем классе модели. К сожалению, ответ 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>.