首页 文章

PB使用JdbcBatchItemWriter和JAVA代码中的CompositeItemWriter - Spring-Batch

提问于
浏览
0

我扩展了官方Spring-Batch站点提供的批处理服务代码--Batch Processing Service并修改了ItemWriter以生成CSV并写入数据库 .

我使用CompositeItemWriter写入CSV和数据库 . 但是,JdbcBatchItemWriter与CompositeItemWriter无法正常工作 . 代码如下所示 .

@Bean
public ItemWriter<Person> writer(DataSource dataSource) {
CompositeItemWriter<Person> cWriter = new CompositeItemWriter<Person>();   

// For DataBase 
JdbcBatchItemWriter<Person> writer = new JdbcBatchItemWriter<Person>();
    writer.setItemSqlParameterSourceProvider(new BeanPropertyItemSqlParameterSourceProvider<Person>());
    writer.setSql("INSERT INTO people (first_name, last_name) VALUES (:firstName, :lastName)");
    writer.setDataSource(dataSource);

// For CSV
FlatFileItemWriter<Person> csvWriter = new FlatFileItemWriter<Person>();
csvWriter.setResource(new FileSystemResource(new File("./csv/new-data.csv")));
csvWriter.setShouldDeleteIfExists(true);
DelimitedLineAggregator<Person> lineAggregator = new DelimitedLineAggregator<Person>();
lineAggregator.setDelimiter(","); 

BeanWrapperFieldExtractor<Person> fieldExtractor = new BeanWrapperFieldExtractor<Person>();
String[] names = {"firstName", "lastName"};
fieldExtractor.setNames(names);
lineAggregator.setFieldExtractor(fieldExtractor);
csvWriter.setLineAggregator(lineAggregator);

List<ItemWriter<? super Person>> mWriter = new ArrayList<ItemWriter<? super Person>>();
mWriter.add(writer); // **Comment this line and the code works fine**
mWriter.add(csvWriter);
cWriter.setDelegates(mWriter);
    return cWriter;
}

评论这一行 - mWriter.add(作家);运行代码 . 这表明CompositeItemWriter适用于FlatFileitemWriter,但不适用于JdbcBatchItemWriter . 我得到的错误是 -

or.springframework.jdbc.BadSqlGrammerException: PreparedStatementCallback; bad SQL grammar 
[insert into people(first_name, last_name) VALUES (:firstName, :lastName)]

Caused by: Syntax error in SQl statement "insert into people((first_name, last_name) VALUES (:[*]firstName, :lastName)"; expected"), DEFAULT, NOT, EXISTS, INTERSECTS, SELECT, FROM"; SQL Statement:

如何解决JdbcBatchItemWriter与CompositeItemWriter一起正常工作?

1 回答

  • 4

    它是jdbc auto config的问题,在多个itemWriters的情况下没有运行 . 请以相同的顺序添加最后一行: -

    JdbcBatchItemWriter<Person> writer = new JdbcBatchItemWriter<Person>();
    writer.setItemSqlParameterSourceProvider(new BeanPropertyItemSqlParameterSourceProvider<Person>());
    writer.setSql("INSERT INTO people (first_name, last_name) VALUES (:firstName, :lastName)");
    writer.setDataSource(dataSource);
    
    writer.afterPropertiesSet();
    

相关问题