在使用 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 可以帮助您实现这一目标:

请注意,ResourceAware 项的典型用例是与 MultiResourceItemReader 一起使用,如您的情况。