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

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

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

@Bean public ItemWriter writer(DataSource dataSource) { CompositeItemWriter cWriter = new CompositeItemWriter(); // For DataBase JdbcBatchItemWriter writer = new JdbcBatchItemWriter(); writer.setItemSqlParameterSourceProvider(new BeanPropertyItemSqlParameterSourceProvider()); writer.setSql("INSERT INTO people (first_name, last_name) VALUES (:firstName, :lastName)"); writer.setDataSource(dataSource); // For CSV FlatFileItemWriter csvWriter = new FlatFileItemWriter(); csvWriter.setResource(new FileSystemResource(new File("./csv/new-data.csv"))); csvWriter.setShouldDeleteIfExists(true); DelimitedLineAggregator lineAggregator = new DelimitedLineAggregator(); lineAggregator.setDelimiter(","); BeanWrapperFieldExtractor fieldExtractor = new BeanWrapperFieldExtractor(); String[] names = {"firstName", "lastName"}; fieldExtractor.setNames(names); lineAggregator.setFieldExtractor(fieldExtractor); csvWriter.setLineAggregator(lineAggregator); List<ItemWriter> mWriter = new ArrayList<ItemWriter>(); 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一起正常工作?

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

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