我的 POJO 是这样的:
@Data
@NoArgsConstructor
@AllArgsConstructor
public class FileInfo {
private String filepath;
private String ignorestr1;
private String firstname;
private String lastname;
private String employeeid;
private String applicantid;
private String createdate;
private String startretdate;
private String retlength;
private String emporapplicant;
}
我的 ItemReader 是这样的:
@Bean
@StepScope
@Qualifier("FileInfoItemReader")
@DependsOn("partitioner")
public FlatFileItemReader<FileInfo> FileInfoItemReader(@Value("#{stepExecutionContext['fileName']}") String filename)
throws MalformedURLException {
return new FlatFileItemReaderBuilder<FileInfo>().name("FileInfoItemReader").delimited().delimiter("|")
.names(new String[] { "filepath", "ignorestr1", "firstname", "lastname", "employeeid", "applicantid", "createdate", "startretdate", "retlength", "emporapplicant" })
.fieldSetMapper(new BeanWrapperFieldSetMapper<FileInfo>() {
{
setTargetType(FileInfo.class);
}
}).resource(new UrlResource(filename)).build();
}
更新:
我完整的 BatchConfig:
@Configuration
@EnableBatchProcessing
public class BatchConfiguration {
private static final Logger log = LoggerFactory.getLogger(BatchConfiguration.class);
@Autowired
public JobBuilderFactory jobBuilderFactory;
@Autowired
public StepBuilderFactory stepBuilderFactory;
@Autowired
private FlatFileItemReader<FileInfo> FileInfoItemReader;
@Bean("partitioner")
@StepScope
public Partitioner partitioner() {
log.info("In Partitioner");
MultiResourcePartitioner partitioner = new MultiResourcePartitioner();
ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
Resource[] resources = null;
try {
resources = resolver.getResources("*.csv");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
partitioner.setResources(resources);
partitioner.partition(10);
return partitioner;
}
@Bean
public FileInfoItemProcessor processor() {
return new FileInfoItemProcessor();
}
@Bean
public FileInfoWriter<FileInfo> writer() {
return new FileInfoWriter<FileInfo>();
}
@Bean
public Job importUserJob(JobCompletionNotificationListener listener, Step step1) {
return jobBuilderFactory.get("importUserJob").incrementer(new RunIdIncrementer()).listener(listener)
.flow(masterStep()).end().build();
}
@Bean
public Step step1() {
return stepBuilderFactory.get("step1").<FileInfo, FileInfo>chunk(10).reader(FileInfoItemReader).processor(processor()).writer(writer())
.build();
}
@Bean
public ThreadPoolTaskExecutor taskExecutor() {
ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();
taskExecutor.setMaxPoolSize(25);
taskExecutor.setCorePoolSize(25);
taskExecutor.setQueueCapacity(25);
taskExecutor.afterPropertiesSet();
return taskExecutor;
}
@Bean
@Qualifier("masterStep")
public Step masterStep() {
return stepBuilderFactory.get("masterStep").partitioner("step1", partitioner()).step(step1())
.taskExecutor(taskExecutor()).build();
}
@Bean
@StepScope
@Qualifier("FileInfoItemReader")
@DependsOn("partitioner")
public FlatFileItemReader<FileInfo> FileInfoItemReader(@Value("#{stepExecutionContext['fileName']}") String filename)
throws MalformedURLException {
return new FlatFileItemReaderBuilder<FileInfo>().name("FileInfoItemReader").delimited().delimiter("|")
.names(new String[] { "I", "can", "put", "literally", "anything", "here", "and", "it", "works", "just_fine" })
.fieldSetMapper(new BeanWrapperFieldSetMapper<FileInfo>() {
{
setTargetType(FileInfo.class);
}
}).resource(new UrlResource(filename)).build();
}
}
疑问/问题:我的映射遵循我的 FileInfo 中的严格顺序。如果我private String....
在 POJO 中切换任何位置,csv 的行元素的映射就会混乱。这是预期的行为吗?如果没有,那么我在这里缺少什么?或者使它独立于 POJO 序列的正确方法是什么?