У меня есть специальный писатель, который хорошо работает; однако я бы хотел установить имя моего выходного файла через JobParameters вместо использования фиксированной строки в моей конфигурации. Для этого я добавил аннотацию и параметры @StepScope, как и со своим ItemReader.
Объявление ItemWriter
@Bean
@StepScope
public ItemWriter<CityProcessed> writer(@Value("#{jobParameters[inputFile]}") String inputFile, @Value("#{jobParameters[outputFile]}") String outputFile) {
// String inputFile = "D:/cities.csv";
// String outputFile = "D:/compterendu.csv";
FlatFileItemWriter<CityCRE> writer = new FlatFileItemWriter<CityCRE>();
FileSystemResource isr;
isr = new FileSystemResource(new File(outputFile));
writer.setResource(isr);
DelimitedLineAggregator<CityCRE> aggregator = new DelimitedLineAggregator<CityCRE>();
aggregator.setDelimiter(";");
BeanWrapperFieldExtractor<CityCRE> beanWrapper = new BeanWrapperFieldExtractor<CityCRE>();
beanWrapper.setNames(new String[]{
"nom", "pays", "identifiantBase", "c/m"
});
aggregator.setFieldExtractor(beanWrapper);
writer.setLineAggregator(aggregator);
CityItemWriter itemWriter = new CityItemWriter();
writer.setFooterCallback(itemWriter);
writer.setHeaderCallback(itemWriter);
itemWriter.setDelegate(writer);
itemWriter.setInputFileName(inputFile);
return itemWriter;
}
Объявление шага
@Bean
public Step stepImport(StepBuilderFactory stepBuilderFactory, ItemReader<CityFile> reader, ItemWriter<CityProcessed> writer, ItemProcessor<CityFile, CityProcessed> processor) {
return stepBuilderFactory
.get("step1")
.<CityFile, CityProcessed> chunk(10)
.reader(reader(null))
.processor(processor)
.writer(writer(null, null))
.build();
}
Этот код не работает, я получаю WriterNotOpenException из-за FlatFileItemWriter, который я использую в качестве делегата.
У меня была такая же ошибка, когда я пытался использовать JobParameters для своего ItemReader, мне пришлось изменить тип возвращаемого значения на «FlatFileItemReader» (вместо ItemReader). Я не могу сделать то же самое здесь, потому что мне нужен мой собственный ItemWriter, а не простой FlatFileItemWriter.
Я не понимаю, почему я получаю эту ошибку, когда добавляю @StepScope, в то время как у моего читателя нет проблем без этого. Что я делаю неправильно ?
Дополнительная информация :
- Моя конфигурация работала, когда я использовал строки inputFile и outputFile.
- Похоже, у меня возникает ошибка, когда я добавляю аннотацию @StepScope (даже без добавления JobParameters в качестве параметров записи).