Root элемент записывается несколько раз в весенний период - PullRequest
0 голосов
/ 07 февраля 2020

У меня есть требование написать пакет пружины, который читает из базы данных и записывает в XML. Я написал партию, но я столкнулся с проблемой. Я должен написать XML в формате ниже,
Например,

<Definition>
  <item>
    <name></name>
  </item>
  <Item>
    <name></name>
  </Item>
</Definition>

здесь <Definition> - это элемент root, который должен быть напечатан только один раз, а <item> может быть от 1 до п и это не root в XSD. Я использую StaxEventItemWriter для этого.

Я могу использовать headerCallback для <Definition>, но проблема, с которой я сталкиваюсь, заключается в том, чтобы установить <item> в classesToBeBound, поскольку это не элемент root. сделать это как root, тогда jaxb вставляет пространство имен по умолчанию в xml.
Writer выглядит следующим образом

ItemWriter extends StaxEventItemWriter<item>{
Jaxb2Marshaller marshaller = new Jaxb2Marshaller ();
marshaller .setClassesToBeBound(Item.class);
this.setMarshaller(marshaller );
this.setOverWriteOutput(false);
}```

1 Ответ

0 голосов
/ 12 февраля 2020

Тег root не должен записываться несколько раз. Вот краткий пример:

import java.util.Arrays;
import java.util.List;

import javax.xml.bind.annotation.XmlRootElement;

import org.springframework.batch.core.Job;
import org.springframework.batch.core.JobParameters;
import org.springframework.batch.core.configuration.annotation.EnableBatchProcessing;
import org.springframework.batch.core.configuration.annotation.JobBuilderFactory;
import org.springframework.batch.core.configuration.annotation.StepBuilderFactory;
import org.springframework.batch.core.launch.JobLauncher;
import org.springframework.batch.item.ItemReader;
import org.springframework.batch.item.support.ListItemReader;
import org.springframework.batch.item.xml.StaxEventItemWriter;
import org.springframework.batch.item.xml.builder.StaxEventItemWriterBuilder;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.FileSystemResource;
import org.springframework.oxm.jaxb.Jaxb2Marshaller;

@Configuration
@EnableBatchProcessing
public class MyJob {

    @Bean
    public ItemReader<Person> itemReader() {
        List<Person> persons = Arrays.asList(new Person("foo"), new Person("bar"));
        return new ListItemReader<>(persons);
    }

    @Bean
    public StaxEventItemWriter<Person> itemWriter() {
        Jaxb2Marshaller marshaller = new Jaxb2Marshaller();
        marshaller.setClassesToBeBound(Person.class);
        return new StaxEventItemWriterBuilder<Person>()
                .name("personsWriter")
                .rootTagName("persons")
                .resource(new FileSystemResource("persons.xml"))
                .marshaller(marshaller)
                .build();
    }

    @Bean
    public Job job(JobBuilderFactory jobs, StepBuilderFactory steps) {
        return jobs.get("job")
                .start(steps.get("step")
                        .<Person, Person>chunk(5)
                        .reader(itemReader())
                        .writer(itemWriter())
                        .build())
                .build();
    }

    @XmlRootElement
    static class Person {

        private String name;

        public Person() {
        }

        public Person(String name) {
            this.name = name;
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }
    }

    public static void main(String[] args) throws Exception {
        ApplicationContext context = new AnnotationConfigApplicationContext(MyJob.class);
        JobLauncher jobLauncher = context.getBean(JobLauncher.class);
        Job job = context.getBean(Job.class);
        jobLauncher.run(job, new JobParameters());
    }

}

Если вы запустите этот пример, он сгенерирует следующий файл persons.xml:

<?xml version="1.0" encoding="UTF-8"?>
<persons>
    <person>
        <name>foo</name>
    </person>
    <person>
        <name>bar</name>
    </person>
</persons>

Как видите, тег root persons написано только один раз. Вы можете найти полный код примера здесь .

...