qrius
qrius

Reputation: 631

Parse filename while using JsonItemReader and process it with each record

I am using spring-batch multi resource JsonItemReader to read multiple files with multiple json objects in a given directory. While processing each record, I also need the name of the file that particular record is coming from. Is there any way to extract the filename and use it in the processor?

Upvotes: 0

Views: 774

Answers (2)

Mahmoud Ben Hassine
Mahmoud Ben Hassine

Reputation: 31620

There are two APIs in Spring Batch that help you achieve that:

Note that a typical use case of ResourceAware items is when used with a MultiResourceItemReader, as in your case.

Upvotes: 1

PAA
PAA

Reputation: 12005

I think you need to use CompositeItemReader and in the Processor (create if you not already have), add one flag (add field to your model class) and set file name to that flag.

@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();
}

Note: You need to implement the MultiResourceItemReader and based on above suugestions, you can differentiate your records coming from which file.

Below code is for reference, doesn't necessary mean to use as is.

@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;
    }

Upvotes: 0

Related Questions