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