Reputation: 631
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
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
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