Я хотел бы написать файл XML и иметь количество обработанных записей и итоговую сумму в заголовке
<?xml version='1.0' encoding='UTF-8'?>
<SettlementReport>
<GroupHeader>
<DocumentType>My Report</DocumentType>
<SettlementInfo>
<SettlementId>MyReport_20191025</SettlementId>
<SettlementDate>2019-10-25</SettlementDate>
<NumOfTransactions>2</NumOfTransactions>
<ReportTotal>1000</ReportTotal>
</SettlementInfo>
</GroupHeader>
<PaymentInfo>
<RRN>12345</RRN>
<VehicleRegistration>AA00AAGP</VehicleRegistration>
<Province>GP</Province>
<VPSStatus>Application Submitted to Dept</VPSStatus>
<SBStatus>Fit for Settlement</SBStatus>
<ServiceCharge>10.00</ServiceCharge>
<LicenceFee>402.00</LicenceFee>
<DeliveryFee>38.00</DeliveryFee>
<OrderTotal>450.00</OrderTotal>
</PaymentInfo>
<PaymentInfo>
<RRN>12346</RRN>
<VehicleRegistration>AA00ABGP</VehicleRegistration>
<Province>GP</Province>
<VPSStatus>Application Submitted to Dept</VPSStatus>
<SBStatus>Fit for Settlement</SBStatus>
<ServiceCharge>10.00</ServiceCharge>
<LicenceFee>502.00</LicenceFee>
<DeliveryFee>38.00</DeliveryFee>
<OrderTotal>550.00</OrderTotal>
</PaymentInfo>
</SettlementReport>
Я использую StaxEventItemWriter, и мои Бины настроены следующим образом:
@StepScope
@Bean
StaxEventItemWriter<PaymentInformation> xmlReportWriter() {
StaxEventItemWriter<PaymentInformation> xmlFileWriter = new StaxEventItemWriter<>();
String formattedDate = LocalDateTime.now().format(DateTimeFormatter.ISO_LOCAL_DATE);
String exportFilePath = "my_report_".concat(formattedDate).concat(".xml");
xmlFileWriter.setResource(new FileSystemResource(exportFilePath));
xmlFileWriter.setRootTagName("SettlementReport");
xmlFileWriter.setMarshaller(paymentInfoMarshaller());
xmlFileWriter.setHeaderCallback(getSettlementReportHeaderCallBack());
return xmlFileWriter;
}
@Bean
@StepScope
SettlementReportHeaderCallBack getSettlementReportHeaderCallBack(){
return new SettlementReportHeaderCallBack(2, BigDecimal.TEN);
}
@Bean
public Step reportStep() {
return steps.get("settlementReport")
.<Order, PaymentInformation>chunk(100)
.reader(reader())
.processor(processor())
.writer(xmlReportWriter())
.build();
}
Мой обратный вызов заголовка принимает два параметра в конструкторе, потому что я надеялся передать количество транзакций и сумму.
@Slf4j
@RequiredArgsConstructor
public class SettlementReportHeaderCallBack implements StaxWriterCallback {
private final int numberOfTransactions;
private final BigDecimal controlSum;
@Override
public void write(XMLEventWriter writer) {
XMLEventFactory factory = XMLEventFactory.newInstance();
try {
writer.add(factory.createStartElement("", "", "GroupHeader"));
writer.add(factory.createStartElement("", "", "DocumentType"));
writer.add(factory.createCharacters("Settlement Report"));
writer.add(factory.createEndElement("", "", "DocumentType"));
writer.add(factory.createStartElement("", "", "SettlementInfo"));
writer.add(factory.createStartElement("", "", "SettlementId"));
writer.add(factory.createCharacters("VAS_VPS_LD_".concat(LocalDateTime.now().format(DateTimeFormatter.BASIC_ISO_DATE))));
writer.add(factory.createEndElement("", "", "SettlementId"));
writer.add(factory.createStartElement("", "", "SettlementDate"));
writer.add(factory.createCharacters(LocalDateTime.now().format(DateTimeFormatter.ISO_LOCAL_DATE)));
writer.add(factory.createEndElement("", "", "SettlementDate"));
writer.add(factory.createStartElement("", "", "NumOfTransactions"));
writer.add(factory.createCharacters(String.valueOf(numberOfTransactions)));
writer.add(factory.createEndElement("", "", "NumOfTransactions"));
writer.add(factory.createStartElement("", "", "ReportTotal"));
writer.add(factory.createCharacters(controlSum.toString()));
writer.add(factory.createEndElement("", "", "ReportTotal"));
writer.add(factory.createEndElement("", "", "SettlementInfo"));
writer.add(factory.createEndElement("", "", "GroupHeader"));
} catch (XMLStreamException e) {
log.error("Error writing XML Header: {}", e.getMessage());
throw new XmlWriterException(e.getMessage());
}
}
}
Мой вопрос заключается в том, как получить количество обработанных транзакций изапишите их в заголовок того же файла, что и платежная информация. Есть ли способ получить доступ к информации о выполнении до начала записи, потому что это не может быть в нижнем колонтитуле в соответствии с моим дизайном?