Spring Batch FlatFileItemWriter записывает объект со списком
У меня есть партнер Pojo: список идентификаторов партнеров
Адрес Pojo: AddressId, Адрес, Город, Страна, Пин
Я хочу создать плоский файл в Spring Batch - файл будет выглядеть так: PartnerId;AddressId;Address;City;Country;Pin
Я получаю партнера Pojo с идентификатором и списком адресов
Как я могу использовать FlatFileItemWriter с конфигурацией PartnerPojo My FlatFileItemWriterConfiguration:
<?xml version="1.0" encoding="UTF-8"?>
<bean id="itemWriter" class="org.springframework.batch.item.file.FlatFileItemWriter">
<property name="resource" value="file:outputFile.txt" />
<property name="lineAggregator">
<bean class="org.springframework.batch.item.file.transform.DelimitedLineAggregator">
<property name="delimiter" value=";" />
<property name="fieldExtractor">
<bean class="org.springframework.batch.item.file.transform.BeanWrapperFieldExtractor">
<property name="names" value="partnerId, addressId, address,city,country,pin " />
</bean>
</property>
</bean>
</property>
<property name="headerCallback" ref="headerCallback" />
</bean>
Я получаю сообщение об ошибке по адресу
1 ответ
Вам нужно сгладить ваши данные и передать списку плоских элементов, как и ожидалось, в выходной файл для писателя. Например:
class Partner {
int id;
List<Address> addresses;
}
class Address {
int addressId;
String address,city,country,pin;
}
// create this Pojo to encapsulate flat data (as in the expected csv)
class PartnerAddress {
int partnerId, addressId;
String address,city,country,pin;
}
Обработчик элементов подготовит данные:
class PartnerItemProcessor implements ItemProcessor<Partner, List<PartnerAddress>> {
@Override
public List<PartnerAddress> process(Partner partner) {
List<PartnerAddress> partnerAddresses = new ArrayList<>();
for (Address address : partner.getAddresses()) {
PartnerAddress partnerAddress = new PartnerAddress();
partnerAddress.setPartnerId(partner.getId());
partnerAddress.setAddressId(address.getAddressId());
partnerAddress.setAddress(address.getAddress());
partnerAddress.setCity(address.getCity());
partnerAddress.setCountry(address.getCountry());
partnerAddress.setPin(address.getPin());
partnerAddresses.add(partnerAddress);
}
return partnerAddresses;
}
}
Затем писатель получает список PartnerAddress
и запишите их в плоский файл.
Надеюсь это поможет.