Springboot/Spring 批量加载不带分隔符的文件
Springboot/Spring Batch load a file without separator
使用 Springboot/Spring 批处理,我尝试加载一个没有分隔符的文件。
文件示例:
field1field2field3
field1field2field3
field1field2field3
这是我的代码:
@Bean
public FlatFileItemReader<Person> reader() {
return new FlatFileItemReaderBuilder<Person>()
.name("personItemReader")
.resource(new ClassPathResource("people.txt"))
.lineTokenizer(new FixedLengthTokenizer() {{ setNames("firstName", "lastName"); setColumns(new Range(1-6,7-12)); }})
.fieldSetMapper(new BeanWrapperFieldSetMapper<Person>() {{ setTargetType(Person.class); }})
.build()
;
}
但是没用。我有以下错误,我不明白为什么:
Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.batch.item.file.FlatFileItemReader]: Factory method 'reader' threw exception; nested exception is java.lang.IllegalArgumentException: Min value must be higher than zero
你能解释一下吗?
您在此处声明的行分词器不正确:
.lineTokenizer(new FixedLengthTokenizer() {{
setNames("firstName", "lastName");
setColumns(new Range(1-6,7-12));
}})
这就好像您指定了 [-5, -5] 的范围。 setColumns
采用 Range
的可变参数,其中每个范围应使用 Range(min, max)
创建。所以在你的情况下它应该是这样的:
.lineTokenizer(new FixedLengthTokenizer() {{
setNames("firstName", "lastName");
setColumns(new Range(1,6), new Range(7,12));
}})
使用 Springboot/Spring 批处理,我尝试加载一个没有分隔符的文件。
文件示例:
field1field2field3
field1field2field3
field1field2field3
这是我的代码:
@Bean
public FlatFileItemReader<Person> reader() {
return new FlatFileItemReaderBuilder<Person>()
.name("personItemReader")
.resource(new ClassPathResource("people.txt"))
.lineTokenizer(new FixedLengthTokenizer() {{ setNames("firstName", "lastName"); setColumns(new Range(1-6,7-12)); }})
.fieldSetMapper(new BeanWrapperFieldSetMapper<Person>() {{ setTargetType(Person.class); }})
.build()
;
}
但是没用。我有以下错误,我不明白为什么:
Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.batch.item.file.FlatFileItemReader]: Factory method 'reader' threw exception; nested exception is java.lang.IllegalArgumentException: Min value must be higher than zero
你能解释一下吗?
您在此处声明的行分词器不正确:
.lineTokenizer(new FixedLengthTokenizer() {{
setNames("firstName", "lastName");
setColumns(new Range(1-6,7-12));
}})
这就好像您指定了 [-5, -5] 的范围。 setColumns
采用 Range
的可变参数,其中每个范围应使用 Range(min, max)
创建。所以在你的情况下它应该是这样的:
.lineTokenizer(new FixedLengthTokenizer() {{
setNames("firstName", "lastName");
setColumns(new Range(1,6), new Range(7,12));
}})