我有一个效果很好的自定义作家;但是,我想通过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();
}
这段代码不起作用,因为我用作委托的FlatFileItemWriter,我得到一个WriterNotOpenException。
当我尝试将JobParame用于我的ItemReader时,我遇到了同样的错误,我不得不将返回类型更改为“FlatFileItemReader”(而不是ItemReader)。我不能在这里做同样的事情因为我需要自定义ItemWriter而不是简单的FlatFileItemWriter。
我不明白为什么在添加@StepScope时出现此错误,而没有它我的阅读器没有问题。我做错了什么?
其他信息:
答案 0 :(得分:0)
您必须将委托编写者注册为流;通过这种方式,SB将以正确的方式管理流生命周期。
答案 1 :(得分:0)
谁是CityItemWriter的实现者?
尝试-将公共ItemWriter更改为FlatFileItemWriter
错误
公共 ItemWriter leituraArquivoDelimitadoWriter(@Value(“#{jobParameters ['arquivoSaidaClientes']}”)资源arquivoClienteSaida){ //返回项目-> items.forEach(System.out :: println);
return new **FlatFileItemWriterBuilder**<Cliente>()
.name("leituraArquivoDelimitadoWriter")
.resource(arquivoClienteSaida)
.delimited()
.names(new String [] {"nome", "sobrenome", "idade", "email"})
.build();
}
}
消息错误
org.springframework.batch.item.WriterNotOpenException:必须先打开Writer,然后才能将其写入
确定
公共 FlatFileItemWriter leituraArquivoDelimitadoWriter(@Value(“#{jobParameters ['arquivoSaidaClientes']}”)资源arquivoClienteSaida){ //返回项目-> items.forEach(System.out :: println);
return new **FlatFileItemWriterBuilder**<Cliente>()
.name("leituraArquivoDelimitadoWriter")
.resource(arquivoClienteSaida)
.delimited()
.names(new String [] {"nome", "sobrenome", "idade", "email"})
.build();
}
}
在这种情况下,将public ItemWriter 更改为FlatFileItemWriter即可解决问题。