Разбор имени файла при использовании JsonItemReader и обработка его с каждой записью - PullRequest
0 голосов
/ 08 апреля 2020

Я использую многоресурсный Spring-Batch JsonItemReader для чтения нескольких файлов с несколькими json объектами в данном каталоге. При обработке каждой записи мне также нужно имя файла, из которого поступает конкретная запись. Есть ли способ извлечь имя файла и использовать его в процессоре?

Ответы [ 2 ]

1 голос
/ 08 апреля 2020

В Spring Batch есть два API, которые помогут вам достичь этого:

  • MultiResourceItemReader # getCurrentResource предоставляет вам текущий ресурс, который читается читателем делегата.
  • ResourceAware : если ваш элемент реализует этот интерфейс, ему будет вставлен ресурс, с которого он был прочитан.

Обратите внимание, что типичный вариант использования ResourceAware элементов когда используется с MultiResourceItemReader, как в вашем случае.

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

Я думаю, вам нужно использовать CompositeItemReader и в Processor (создать, если у вас его еще нет), добавить один флаг (добавить поле в класс вашей модели) и установить имя файла для этого флага.

@Bean
public JsonItemReader<Trade> jsonItemReader() {

   ObjectMapper objectMapper = new ObjectMapper();
   // configure the objectMapper as required
   JacksonJsonObjectReader<Trade> jsonObjectReader =new JacksonJsonObjectReader<>(Trade.class);
   jsonObjectReader.setMapper(objectMapper);

   return new JsonItemReaderBuilder<Trade>()
                 .jsonObjectReader(jsonObjectReader)
                 .resource(new ClassPathResource("trades.json"))
                 .name("tradeJsonItemReader")
                 .build();
}

Примечание. Вам необходимо реализовать MultiResourceItemReader и, основываясь на вышеприведенных предположениях, можно различать записи, поступающие из какого файла.

Ниже приведен код для справки, не обязательно означает использовать как есть.

@Bean
    public MultiResourceItemReader<Customer> multiResourceItemreader() {
        MultiResourceItemReader<Customer> reader = new MultiResourceItemReader<>();
        reader.setDelegate(customerItemReader());
        reader.setResources(inputFiles);

        return reader;
    }

    @Bean
    public FlatFileItemReader<Customer> customerItemReader() {
        DelimitedLineTokenizer tokenizer = new DelimitedLineTokenizer();
        tokenizer.setNames(new String[] { "id", "firstName", "lastName", "birthdate" });

        DefaultLineMapper<Customer> customerLineMapper = new DefaultLineMapper<>();
        customerLineMapper.setLineTokenizer(tokenizer);
        customerLineMapper.setFieldSetMapper(new CustomerFieldSetMapper());
        customerLineMapper.afterPropertiesSet();

        FlatFileItemReader<Customer> reader = new FlatFileItemReader<>();
        reader.setLineMapper(customerLineMapper);

        return reader;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...