使用Spring Batch我试图将输入文件的每一行都作为String
提供给ItemProcessor
而不在ItemReader
中进行任何“CSV解析”。
我推出了一个配置Java类(使用@Configuration
和@EnableBatchProcessing
),其中包含以下reader()
方法,该方法使下一个ItemProcessor
抛出{{1}但是。
此ClassCastException
应读取输入文件并以ItemReader
的形式传递到输入文件的每一行ItemProcessor
。
String
运行上一段代码时,@Bean
public ItemReader<String> reader() {
FlatFileItemReader<String> reader = new FlatFileItemReader<>();
reader.setResource(new ClassPathResource("data-to-process.txt"));
reader.setLineMapper(new DefaultLineMapper() {{
setLineTokenizer(new DelimitedLineTokenizer());
setFieldSetMapper(new PassThroughFieldSetMapper());
}});
return reader;
}
中的ItemProcessor
期待String
reader()
,我会收到例外情况:
java.lang.ClassCastException: org.springframework.batch.item.file.transform.DefaultFieldSet cannot be cast to java.lang.String
我写的自定义ItemProcessor
定义为:
public class MyOwnCustomItemProcessor implements ItemProcessor<String, MyOwnCustomBusinessBean> {
我相信我应该在PassThroughFieldSetMapper
中使用此ItemReader
,我不想使用任何类型的标记器。根据文档,我认为我必须使用它,我无法避免它,但我一直在抛出异常。
如何将每个输入行直接“转移”为String
到ItemProcessor
,例如{{1}}。 ?
答案 0 :(得分:6)
如果可用,请使用PassThroughLineMapper
public class PassThroughLineMapper implements LineMapper<String> {
@Override
public String mapLine(String line, int lineNumber) throws Exception {
return line;
}
}
答案 1 :(得分:0)
我还添加了一个同时找到的解决方法(使用FieldSet
作为ItemReader
和ItemProcessor
的输入参数),即使@bellabax提供了更好的解决方案。
检查我如何使用FieldSet
类型的对象。
ItemReader
:
@Bean
public ItemReader<FieldSet> reader() {
FlatFileItemReader<FieldSet> reader = new FlatFileItemReader<>();
reader.setResource(new ClassPathResource("data-to-process.txt"));
reader.setLineMapper(new DefaultLineMapper() {{
setLineTokenizer(new DelimitedLineTokenizer());
setFieldSetMapper(new PassThroughFieldSetMapper() {{
}});
}});
return reader;
}
Spring Batch Configuration类中的ItemProcessor
:
@Bean
public ItemProcessor<FieldSet, MyOwnCustomBusinessBean> processor() {
return new MyOwnCustomItemProcessor();
}
ItemProcessor
:
public class MyOwnCustomItemProcessor implements ItemProcessor<FieldSet, MyOwnCustomBusinessBean> {
@Override
public MyOwnCustomBusinessBean process(FieldSet originalInputLineFromInputFile) throws Exception {
String originalInputLine = originalInputLineFromInputFile.getValues()[0];
[...]