Java 使用spring数据jpa定制ItemReader
我正在使用现有的实体和存储库创建一个Spring批处理项目。对于使用现有jpa存储库读取数据的作业,我需要使用自定义Java 使用spring数据jpa定制ItemReader,java,spring-boot,spring-batch,spring-data-jpa,Java,Spring Boot,Spring Batch,Spring Data Jpa,我正在使用现有的实体和存储库创建一个Spring批处理项目。对于使用现有jpa存储库读取数据的作业,我需要使用自定义ItemReader 自定义阅读器 public class InMemoryReader implements ItemReader<Product> { @Autowired private ProductService productService; private int nextStudentIndex; private
ItemReader
自定义阅读器
public class InMemoryReader implements ItemReader<Product> {
@Autowired
private ProductService productService;
private int nextStudentIndex;
private List<Product> studentData;
public InMemoryReader() {
initialize();
}
private void initialize() {
studentData = new ArrayList<Product>();
studentData.add(new Product("hi"));
for (Product p : productService.get())
studentData.add(p);
nextStudentIndex = 0;
}
@Override
public Product read() throws Exception {
Product nextStudent = null;
if (nextStudentIndex < studentData.size()) {
nextStudent = studentData.get(nextStudentIndex);
nextStudentIndex++;
}
return nextStudent;
}
}
批配置文件
@Configuration
@EnableBatchProcessing
public class BatchConfiguration {
@Autowired
public JobBuilderFactory jobBuilderFactory;
@Autowired
private DataSource dataSource;
@Autowired
public StepBuilderFactory stepBuilderFactory;
@Bean
public ItemReader<Product> reader() throws Exception {
return new InMemoryReader();
}
@Bean
public ProductItemProcessor processor() {
return new ProductItemProcessor();
}
@Bean
public ItemWriter<Product> writer() {
return new ItemWriter<Product>() {
@Override
public void write(List<? extends Product> items) throws Exception {
}
};
}
// end::readerwriterprocessor[]
// tag::listener[]
@Bean
public JobExecutionListener listener() {
return null;
}
// end::listener[]
// tag::jobstep[]
@Bean
public Job importPerson(JobBuilderFactory jobs, Step s1) {
return jobs.get("import")
.incrementer(new RunIdIncrementer()) // because a spring config bug, this incrementer is not really useful
.flow(s1)
.end()
.build();
}
@Bean
public Step step1() throws Exception {
return stepBuilderFactory.get("step1")
.<Product, Product>chunk(10)
.reader(reader())
.processor(processor())
.writer(writer())
.build();
}
}
@配置
@启用批处理
公共类批处理配置{
@自动连线
公共建筑商建筑商工厂;
@自动连线
私有数据源;
@自动连线
公共StepBuilderFactory StepBuilderFactory;
@豆子
public ItemReader()引发异常{
返回新的InMemoryReader();
}
@豆子
public ProductItemProcessor处理器(){
返回新的ProductItemProcessor();
}
@豆子
公共项目编写器(){
返回新的ItemWriter(){
@凌驾
public void write(List您正在从构造函数调用initialize()
,即在连接ProductService
依赖项之前
从构造函数中删除对initialize()
的调用,而是让Spring在连接依赖项后调用它,方法是使用@PostConstruct
对其进行注释,或使用此处概述的其他方法之一:
什么是null,productService?您如何创建InMemoryReader?
@Configuration
@EnableBatchProcessing
public class BatchConfiguration {
@Autowired
public JobBuilderFactory jobBuilderFactory;
@Autowired
private DataSource dataSource;
@Autowired
public StepBuilderFactory stepBuilderFactory;
@Bean
public ItemReader<Product> reader() throws Exception {
return new InMemoryReader();
}
@Bean
public ProductItemProcessor processor() {
return new ProductItemProcessor();
}
@Bean
public ItemWriter<Product> writer() {
return new ItemWriter<Product>() {
@Override
public void write(List<? extends Product> items) throws Exception {
}
};
}
// end::readerwriterprocessor[]
// tag::listener[]
@Bean
public JobExecutionListener listener() {
return null;
}
// end::listener[]
// tag::jobstep[]
@Bean
public Job importPerson(JobBuilderFactory jobs, Step s1) {
return jobs.get("import")
.incrementer(new RunIdIncrementer()) // because a spring config bug, this incrementer is not really useful
.flow(s1)
.end()
.build();
}
@Bean
public Step step1() throws Exception {
return stepBuilderFactory.get("step1")
.<Product, Product>chunk(10)
.reader(reader())
.processor(processor())
.writer(writer())
.build();
}
}
@Service("productService")
public class ProductServiceImpl implements ProductService {
private ProductRepository repository;
@Autowired
public ProductServiceImpl(ProductRepository repository) {
this.repository = repository;
}
@Override
public List<Product> get() {
List<Product> list = new ArrayList<Product>();
for (Product p : repository.findAll())
list.add(p);
return list;
}
}