У меня есть весеннее пакетное задание для парсинга XML в два этапа и вставки данных в базу данных. формат XML похож на пример удара, и я хочу вставить данные в основную деталь, представленную здесь.
<customers>
<header>
<headerElements... >
</header>
<mainList>
<listElements... >
<customer... >
<customer... >
<customer... >
... 100,000 elements ...
</mainList>
</customers>
на первом шаге я хочу проанализировать тег заголовка, а также все элементы из основного list (ожидают клиентов), чтобы вставить их в основную таблицу, а затем на втором шаге я хочу проанализировать элемент 100000 клиентов в базовом шаге чанка.
@Bean
public StaxEventItemReader<Object> masterReader(){
StaxEventItemReader<Object> reader = new StaxEventItemReader<>();
reader.setResource(new ClassPathResource("static/customers.xml"));
reader.setFragmentRootElementNames(new String[] {"header", "mainList"});
Jaxb2Marshaller unMarshaller = new Jaxb2Marshaller();
unMarshaller.setClassesToBeBound(Header.class, MainList.class);
reader.setUnmarshaller(unMarshaller);
return reader;
}
и вот читатель основной чанки, который я хочу использовать
@Bean
public StaxEventItemReader<Customer> detailReader(){
StaxEventItemReader<Customer> reader = new StaxEventItemReader<>();
reader.setResource(new ClassPathResource("static/customers.xml"));
reader.setFragmentRootElementName("customer");
Jaxb2Marshaller unMarshaller = new Jaxb2Marshaller();
unMarshaller.setClassesToBeBound(Customer.class);
reader.setUnmarshaller(unMarshaller);
return reader;
}
вопрос в том, что mainList генерируется с XJ C и уже содержит свойство списка клиентов и аннотацию jaxb. Он также проанализирует список клиентов на шаге мастера. Есть ли способ игнорировать элементы клиента на первом этапе? или есть лучший способ?
РЕДАКТИРОВАТЬ
Поскольку XML и XSD предоставляются третьей стороной и будут иметь обновления в будущем. Я не хочу вносить изменения в объекты, сгенерированные автоматически из XSD с использованием XJ C. Поэтому в будущем разработчики не будут беспокоиться об изменениях. Я также пытался использовать XStream (поскольку он поддерживает добавление пропущенных полей перед unMarshall), но XStream не поддерживает объекты, предоставляемые XJ C, и имеет свои собственные аннотации.
Теперь я ищу способ сделать динамическое связывание c для добавления @transient к определенному атрибуту или как игнорировать его перед unMarshall (пропустить тег при разборе)