在我的春季批处理代码中,我正在读取一个csv文件,将其处理为bean,并尝试使用writer中的值获取bean。但是我无法让豆子成为作家。 UserVO
是具有csv文件中的值的Bean,我正在尝试将其写入writer。我也将bean初始化为一个公共变量,希望它将由reader,processor和writer处理。甚至在@Bean
之前使用了@Autowired
和UserVO user = new UserVO();
注释。请帮助我解决这个问题。以下是我的代码
@EnableBatchProcessing
@Configuration
public class CsvFileToDatabaseConfig {
@Autowired
public JobBuilderFactory jobBuilderFactory;
@Autowired
public StepBuilderFactory stepBuilderFactory;
@Autowired
public DataSource dataSource;
UserVO user = new UserVO();
@Bean
public FlatFileItemReader<UserVO> csvReader() {
FlatFileItemReader<UserVO> reader = new FlatFileItemReader<UserVO>();
try{
reader.setResource(new ClassPathResource("user.csv"));
reader.setLineMapper(new DefaultLineMapper<UserVO>() {{
setLineTokenizer(new DelimitedLineTokenizer() {{
setNames(new String[] { "memberId", "mailId", "fullName", "appCode", "active"});
}});
setFieldSetMapper(new BeanWrapperFieldSetMapper<UserVO>() {{
setTargetType(UserVO.class);
}});
}});
}
catch(Exception e){
System.out.println(" Exception in reading " + e.getMessage());
}
return reader;
}
@Bean
ItemProcessor<UserVO, UserVO> csvProcessor() {
return new Processor();
}
@Bean
public JdbcBatchItemWriter<UserVO> csvWriter(UserVO user) {
JdbcBatchItemWriter<UserVO> csvWriter = new JdbcBatchItemWriter<UserVO>();
System.out.println("MEMBER ID --->" + user.memberId);
return csvWriter;
}
@Bean
public Step csvFileToDatabaseStep() throws Exception {
LDSService ldsService = new LDSService();
return stepBuilderFactory.get("csvFileToDatabaseStep")
.<UserVO, UserVO>chunk(1)
.reader(csvReader())
.processor(csvProcessor())
.writer(csvWriter(user))
.build();
}
@Bean
Job csvFileToDatabaseJob(JobCompletionNotificationListener listener) throws Exception {
return jobBuilderFactory.get("csvFileToDatabaseJob")
.incrementer(new RunIdIncrementer())
.listener(listener)
.flow(csvFileToDatabaseStep())
.end()
.build();
}
}
答案 0 :(得分:0)
public class SkipFooterLineItemProcessor implements ItemProcessor<UserVO, UserVO> {
@Override
public UserVO process(UserVO item) throws Exception {
return item;
}
}
答案 1 :(得分:0)
在您回答问题之前,我想弄清楚您对事物运作方式的理解有些困惑。
当您为Spring Batch组件(读取器,写入器等)定义Spring bean时,此时没有实际的读取或写入操作。您仅定义工作步骤中要使用的bean。当您编写此代码时:
<a href="{{ path('patient_booking_confirmation') }}?idMedecin={{ medecin.id }}&date={{ date }}&heure={{ time }}" class="boutonBookingPage" id="confirmationPaiement">Confirmer votre Rendez-Vous</a>
捕获异常并打印@Bean
public FlatFileItemReader<UserVO> csvReader() {
FlatFileItemReader<UserVO> reader = new FlatFileItemReader<UserVO>();
try{
reader.setResource(new ClassPathResource("user.csv"));
reader.setLineMapper(new DefaultLineMapper<UserVO>() {{
setLineTokenizer(new DelimitedLineTokenizer() {{
setNames(new String[] { "memberId", "mailId", "fullName", "appCode", "active"});
}});
setFieldSetMapper(new BeanWrapperFieldSetMapper<UserVO>() {{
setTargetType(UserVO.class);
}});
}});
}
catch(Exception e){
System.out.println(" Exception in reading " + e.getMessage());
}
return reader;
}
意味着您认为这种方法正在读取,而没有读取。此方法仅定义该步骤将使用的项目读取器。实际读取将通过面向块的步骤自动调用的Exception in reading
方法完成。对于作者而言,也是一样(关于org.springframework.batch.item.ItemReader#read
)。
现在,您无需创建System.out.println("MEMBER ID --->" + user.memberId);
的实例,只需要指定CSV文件的每一行都应映射到哪个域类型,阅读器就会创建该类型的实例。 (如UserVO
在评论中所述)。因此,您需要删除以下行:M. Deinum
,您的工作定义应该没问题。
您可以在https://spring.io/guides/gs/batch-processing/入门指南中找到类似的用例。您将看到不需要手动创建域类型为UserVO user = new UserVO();
的实例。
希望这可以帮助并澄清一些事情。