У меня есть пользовательский писатель, который хорошо работает; однако я хотел бы задать имя моего выходного файла через JobParameters вместо использования фиксированной строки в моей конфигурации. Для этого я добавил аннотацию и параметры @StepScope, как и в моем ItemReader.WriterNotOpenException при использовании аннотации StepScope в Spring Batch
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, в то время как у моего читателя нет проблем без него. Что я делаю не так ?
Дополнительная информация:
- Моя конфигурация работала, когда я использовал строки файл_ввода и OUTPUTFILE.
- Похоже, что у меня ошибка при добавлении аннотации @StepScope (даже без добавления параметров JobParameters в качестве параметров записи).
Он работает (спасибо), но я до сих пор не понимаю, почему он работает, когда я использую только фиксированные строки без необходимости регистрации делегата в качестве потока. Есть ли объяснение этому? – Carrm
Я не могу вам помочь, извините :(Я полагаю, что регистрация в статическом/ограниченном регистре работает по-другому, но @MMinella может дать вам правильное объяснение. –