Как сформировать XML динамически на основе конфигурации в Spring Batch - PullRequest
0 голосов
/ 26 апреля 2020
  1. Я должен прочитать данные из таблицы БД и преобразовать их в файл XML.

  2. Кроме того, поля (столбцы таблицы ) то, что необходимо преобразовать как XML, должно управляться конфигурацией (файл свойств или таблица конфигурации).

Я завершил первую часть, используя Spring Batach (Spring Boot App). Пожалуйста, предоставьте руководство для завершения второй части.

<code>
    @Bean("dbToXmlJob")
    public Job dbToXmlJob(@Qualifier("dbToXmlStep") Step step) throws Exception {
        return this.jobBuilderFactory
            .get(Constants.JOB_NAME_DB_TO_XML)
            //.validator(dbToXmlJobValidator())
            .start(step)
            .build();
    }

    @Bean("dbToXmlStep")
    public Step dbToXmlStep(@Qualifier("jpaReader") ItemReader<PatientEntity> itemReader,
                     @Qualifier("dbToXmlProcessor")Function<PatientEntity, PatientRecord> processor,
                     @Qualifier("xmlWriter")ItemWriter<PatientRecord> writer) throws Exception {
        return this.stepBuilderFactory
            .get(Constants.STEP_NAME_DB_TO_XML)
            .<PatientEntity, PatientRecord>chunk(2)
            .reader(itemReader)
            .processor(processor)
            .writer(writer)
            .build();
    }

    @Bean("jpaReader")
    @StepScope
    public JpaPagingItemReader<PatientEntity> dbReader() throws Exception {
        String jpqlQuery = "SELECT p from PatientEntity p";

        JpaPagingItemReader<PatientEntity> reader = new JpaPagingItemReader<>();
        reader.setQueryString(jpqlQuery);
        reader.setEntityManagerFactory(batchEntityManagerFactory);
        reader.setPageSize(100);
        reader.afterPropertiesSet();
        reader.setSaveState(true);

        return reader;
    }

    @Bean("dbToXmlProcessor")
    @StepScope
    public Function<PatientEntity, PatientRecord> xmlProcessor() {
        return (patientRecord) ->  {
            return new PatientRecord(
                patientRecord.getSourceId(),
                patientRecord.getFirstName(),
                patientRecord.getMiddleInitial(),
                patientRecord.getLastName(),
                patientRecord.getEmailAddress(),
                patientRecord.getPhoneNumber(),
                patientRecord.getStreet(),
                patientRecord.getCity(),
                patientRecord.getState(),
                patientRecord.getZipCode(),
                patientRecord.getBirthDate().toString(),
                patientRecord.getSocialSecurityNumber());
        };
    }

    @Bean("xmlWriter")
    @StepScope
    public StaxEventItemWriter<PatientRecord> xmlWriter() {

        StaxEventItemWriter<PatientRecord> xmlFileWriter = new StaxEventItemWriter<>();

        String exportFilePath = "file:xml/patients.xml";
        Path file = Paths.get(applicationProperties.getBatch().getInputPath() + 
                File.separator + "output.xml");
        xmlFileWriter.setResource(new FileSystemResource(file));
        xmlFileWriter.setRootTagName("employees");

        Jaxb2Marshaller empMarshaller = new Jaxb2Marshaller();
        empMarshaller.setClassesToBeBound(PatientRecord.class);
        xmlFileWriter.setMarshaller(empMarshaller);
        System.out.println("marshalling");;
        return xmlFileWriter;

    }
</code>

Спасибо, Балахандар

1 Ответ

0 голосов
/ 27 апреля 2020

Пожалуйста, предоставьте руководство для завершения второй части.

Кроме того, поля (столбцы таблицы), которые необходимо преобразовать как XML, должны управляться конфигурацией (файл свойств или таблица конфигурации).

Вы можете поместить столбцы, которые вы хотите в файле свойств, например application.properties:

columns=column1,column5,column42

и настройте ваш читатель с ними:

@Configuration
@EnableBatchProcessing
@PropertySource("classpath:application.properties")
class MyConfigClass {

   @StepScope
   public JpaPagingItemReader<PatientEntity> dbReader(@Value("${columns}") String columns) throws Exception {
      String[] columnsArray = columns.split(",");
      // use columns to dynamically create your query
   }

   // the rest of your config

}
...