假设我有两个类以以下方式实现(为了清楚起见,省略作业和 block 代码)。每个读取器都会有一个基于它们声明的配置类的分隔符。
1) 显然,我希望在另一个类中推广代码重复,因为如果我决定在 class*ItemReader() 中添加代码,我将不得不在多个文件中执行此操作。如何才能做到这一点呢?这里不仅“分隔符”很重要,而且 itemReaderBuilder 中 <> 内的类也很重要
2) 如何避免每个方法具有不同的名称?它们基本上是相同的,只是需要在 <> 中使用不同的类和不同的分隔符。
3)如何避免将读取器保存在配置类中以在运行时(使用微线程)计算基于日期的资源路径。
@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
}
}
最佳答案
对于您的用例,我看到的一个选项是定义一个抽象通用配置类,在其中定义一个通用读取器。这是一个例子:
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
)的子类中。
关于java - Spring Batch中的ItemReader代码重复问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56925057/