разработка пакета для обработки XML-файла.
XML будет прочитан с использованием StaxEvenItemReader, а входные данные будут проверены в процессоре. Процессор вернет новый
Данные без каких-либо ошибок проверки будут сохранены в базе данных, а данные с ошибкой проверки будут записаны в базу данных с другой структурой XML.
Я расширил ItemWriter для настройки написания. я хотел бы знать, является ли это хорошей практикой и будут ли какие-либо технические проблемы.
Вот конфигурация задания
@Bean
public StaxEventItemReader<CustomerRequest> xmlReader() {
StaxEventItemReader<CustomerRequest> itemReader = new StaxEventItemReader<>();
fileName="customer.xml";
FileSystemResource inputFile = new FileSystemResource(Paths.get(inputDirectory,fileName));
itemReader.setResource(inputFile);
itemReader.setStrict(true);
itemReader.setFragmentRootElementName("customer");
itemReader.setUnmarshaller(xmlReadMarshaller());
return itemReader;
}
public Jaxb2Marshaller xmlReadMarshaller() {
Jaxb2Marshaller marshaller = new Jaxb2Marshaller ();
marshaller.setClassesToBeBound(CustomerRequest.class);
return marshaller;
}
public Jaxb2Marshaller xmlWriteMarshaller() {
Jaxb2Marshaller marshaller = new Jaxb2Marshaller ();
marshaller.setClassesToBeBound(CustomerResponse.class);
return marshaller;
}
@Bean
public CompositeWriter compositeCustomerWriter(CustomerItemWriter customerItemWriter,StaxEventItemWriter<CustomerResponse> customerStaxEventItemWriter) {
CompositeWriter cw = new CompositeWriter();
cw.setCustomerItemWriter(customerItemWriter);
cw.setCustomerXmlWriter(customerStaxEventItemWriter);
return cw;
}
@Bean
public StaxEventItemWriter<CustomerResponse> customerStaxEventItemWriter() {
StaxEventItemWriterBuilder<CustomerResponse> staxBuilder = new StaxEventItemWriterBuilder<>();
FileSystemResource outputFile = new FileSystemResource(Paths.get(inputDirectory,"output.xml"));
return staxBuilder.name("ResponseFile")
.rootTagName("CustomerResponse")
.marshaller(xmlWriteMarshaller())
.resource(outputFile)
.build();
}
@Bean
public TaskletStep createCustomerStep(CustomerProcessor customerProcessor,CustomerItemWriter customerItemWriter,StaxEventItemWriter<CustomerResponse> customerStaxEventItemWriter) {
CompositeWriter compositeInvoiceWriter = compositeInvoiceWriter(customerItemWriter,customerStaxEventItemWriter);
return stepBuilderFactory.get(CREATE_INVOICE_STEP)
.<CustomerRequest,CustomerData>chunk(100)
.reader(xmlReader())
.processor(customerProcessor)
.writer(compositeCustomerWriter(customerItemWriter,customerStaxEventItemWriter))
.stream(customerStaxEventItemWriter)
.build();
}
public class CompositeWriter implements ItemWriter<CustomerData> {
private ItemWriter<CustomerData> customerItemWriter;
private StaxEventItemWriter<CustomerResponse> customerXmlWriter;
@Override
public void write(List<? extends CustomerData> items) throws Exception {
customerItemWriter.write(items);
customerXmlWriter.write(convertToCustomerResponse(items))); converting to different type and calling write n staxevenitem writer
}
}