假设我有两个按以下方式实现的类(为清楚起见,省略了作业和块代码)。每个阅读器将基于声明的配置类具有定界符。
1)很显然,我想将代码重复归纳到另一个类中,因为如果我决定在class * ItemReader()中添加代码,则必须在多个文件中进行重复。如何做到这一点?在这里,不仅“ delimiter” 很重要,而且itemReaderBuilder
中<>内部的类也很重要。2)如何避免每个方法使用不同的名称?基本上是相同的,它们只需要在<>中使用不同的类和不同的定界符即可。
3)如何避免需要将读取器保存在配置类中以在运行时(使用Tasklet)按日期计算资源路径。
@Configuration
public ClassA{
@Value("${fileA.delimiter}")
private String delimiter;
private ItemReader reader;
@Bean
public ItemReader classAItemReader(){
reader = FlatFileItemReaderBuilder<ObjectA>
.get("reader")
.delimiter(this.delimiter)
.blabla()
.build()
return reader
}
}
@Configuration
public ClassB{
@Value("${fileB.delimiter}")
private String delimiter;
private ItemReader reader;
@Bean
public ItemReader classBItemReader(){
reader = FlatFileItemReaderBuilder<ObjectA>
.get("reader")
.delimiter(this.delimiter)
.blabla()
.build()
return reader
}
}
答案 0 :(得分:1)
在您的用例中,我看到的一个选择是定义一个抽象的通用配置类,在其中定义一个通用读取器。这是一个示例:
import org.springframework.batch.item.ItemReader;
import org.springframework.batch.item.file.builder.FlatFileItemReaderBuilder;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
public abstract class MyReaderConfiguration<T> {
@Value("${file.delimiter}")
private String delimiter;
@Value("${file.columns}") // column1,column2
private String fields;
@Bean
public ItemReader<T> itemReader(){
return new FlatFileItemReaderBuilder<T>()
.name("reader")
.delimited()
.delimiter(delimiter)
.names(fields.split(","))
.build();
}
}
您的工作定义的其他部分可以放在具有所需目标类型(ObjectA
或ObjectB
)的子类中。
希望这会有所帮助。