Spring boot 如果CSV格式在所有批处理执行周期中都不固定,如何在Spring批处理中设置目标类型?

Spring boot 如果CSV格式在所有批处理执行周期中都不固定,如何在Spring批处理中设置目标类型?,spring-boot,spring-batch,Spring Boot,Spring Batch,我正在尝试使用spring批处理读取CSV文件。我正在使用FlatFileItemReader。批处理执行是基于块的。 但问题是CSV格式在每个批处理执行周期中都不固定。 例如 在第一个循环中,假设我有一个CSV,它的头是id、firstName、LastName。 在第二个周期-它可以有标题作为名称,地址,工资。 我想将csv的数据保存在一列的键值对中。(对于csv中的每一行,一行将保存在DB中。) 如何实现读取器、处理器和写入器 固定格式的Reader类我已实现如下: public clas

我正在尝试使用spring批处理读取CSV文件。我正在使用FlatFileItemReader。批处理执行是基于块的。 但问题是CSV格式在每个批处理执行周期中都不固定。 例如 在第一个循环中,假设我有一个CSV,它的头是id、firstName、LastName。 在第二个周期-它可以有标题作为名称,地址,工资。 我想将csv的数据保存在一列的键值对中。(对于csv中的每一行,一行将保存在DB中。) 如何实现读取器、处理器和写入器

固定格式的Reader类我已实现如下:

public class Reader {
  public static FlatFileItemReader<Customer> reader(String path) {
    FlatFileItemReader<Customer> reader = new FlatFileItemReader<Customer>();
 
    reader.setResource(new ClassPathResource(path));
    reader.setLineMapper(new DefaultLineMapper<Customer>() {
      {
        setLineTokenizer(new DelimitedLineTokenizer() {
          {
            setNames(new String[] { "id", "firstName", "lastName" });
          }
        });
        setFieldSetMapper(new BeanWrapperFieldSetMapper<Customer>() {
          {
            setTargetType(Customer.class);
          }
        });
      }
    });
    return reader;
  }
}

这个问题与我的问题相似,但我无法理解答案。

这是否回答了你的问题?对这是相似的,但答案并不清楚。答案中提到的Person类是什么?

public class Writer implements ItemWriter<Customer> {
 
  private final CustomerDao customerDao;
  
  public Writer(CustomerDao customerDao) {
    this.customerDao = customerDao;
  }
 
  @Override
  public void write(List<? extends Customer> customers) throws Exception {
    customerDao.insert(customers);
  }
}


import org.springframework.batch.core.Job;
import org.springframework.batch.core.Step;
import org.springframework.batch.core.configuration.annotation.EnableBatchProcessing;
import org.springframework.batch.core.configuration.annotation.JobBuilderFactory;
import org.springframework.batch.core.configuration.annotation.StepBuilderFactory;
import org.springframework.batch.core.launch.support.RunIdIncrementer;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import com.javasampleapproach.batchcsvpostgresql.dao.CustomerDao;
import com.javasampleapproach.batchcsvpostgresql.model.Customer;
import com.javasampleapproach.batchcsvpostgresql.step.Listener;
import com.javasampleapproach.batchcsvpostgresql.step.Processor;
import com.javasampleapproach.batchcsvpostgresql.step.Reader;
import com.javasampleapproach.batchcsvpostgresql.step.Writer;

@Configuration
@EnableBatchProcessing
public class BatchConfig {

 @Autowired
 public JobBuilderFactory jobBuilderFactory;

 @Autowired
 public StepBuilderFactory stepBuilderFactory;

 @Autowired
 public CustomerDao customerDao;

 @Bean
 public Job job() {
   return jobBuilderFactory.get("job").incrementer(new RunIdIncrementer()).listener(new Listener(customerDao))
       .flow(step1()).end().build();
 }

 @Bean
 public Step step1() {
   return stepBuilderFactory.get("step1").<Customer, Customer>chunk(2)
       .reader(Reader.reader("customer-data.csv"))
       .processor(new Processor()).writer(new Writer(customerDao)).build();
 }
}
public class Customer {
 private long id;
 private String firstName;
 private String lastName;

 public Customer() {
 }

 public Customer(long id, String firstName, String lastName) {
   this.id = id;
   this.firstName = firstName;
   this.lastName = lastName;
 }

 public long getId() {
   return id;
 }

 public void setId(long id) {
   this.id = id;
 }

 public String getFirstName() {
   return firstName;
 }

 public void setFirstName(String firstName) {
   this.firstName = firstName;
 }

 public String getLastName() {
   return lastName;
 }

 public void setLastName(String lastName) {
   this.lastName = lastName;
 }
}