Пружинная партия (с использованием модели основных деталей) проблема со вставкой специального xml - PullRequest
0 голосов
/ 26 января 2020

У меня есть весеннее пакетное задание для парсинга 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 (пропустить тег при разборе)

...