在使用 JsonItemReader 时解析文件名并用每条记录处理它
Parse filename while using JsonItemReader and process it with each record
我正在使用 spring-批处理多资源 JsonItemReader 来读取给定目录中包含多个 json 对象的多个文件。在处理每条记录时,我还需要特定记录来自的文件的名称。有没有办法提取文件名并在处理器中使用它?
我认为您需要使用 CompositeItemReader
并在 Processor
中(如果您还没有,请创建),添加一个标志(将字段添加到您的模型 class)并设置该标志的文件名。
@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;
}
Spring 批处理中有两个 API 可以帮助您实现这一目标:
- MultiResourceItemReader#getCurrentResource 为您提供委托 reader.
正在读取的当前资源
- ResourceAware:如果你的项目实现了这个接口,它将被注入它被读取的资源。
请注意,ResourceAware
项的典型用例是与 MultiResourceItemReader
一起使用,如您的情况。
我正在使用 spring-批处理多资源 JsonItemReader 来读取给定目录中包含多个 json 对象的多个文件。在处理每条记录时,我还需要特定记录来自的文件的名称。有没有办法提取文件名并在处理器中使用它?
我认为您需要使用 CompositeItemReader
并在 Processor
中(如果您还没有,请创建),添加一个标志(将字段添加到您的模型 class)并设置该标志的文件名。
@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;
}
Spring 批处理中有两个 API 可以帮助您实现这一目标:
- MultiResourceItemReader#getCurrentResource 为您提供委托 reader. 正在读取的当前资源
- ResourceAware:如果你的项目实现了这个接口,它将被注入它被读取的资源。
请注意,ResourceAware
项的典型用例是与 MultiResourceItemReader
一起使用,如您的情况。