Spring Batch:没有为JDBCBatchItemWriter

问题描述

我有一个Spring批处理应用程序,在该应用程序中,我尝试从DB中读取记录并将其写入文件中,然后更新从DB中获取的行的列。

我能够从数据库读取记录,将其写入文件,但是当我添加更新步骤时,应用程序将失败,并出现奇怪的错误

这是我的POJO课:

    public class Student {
        long studentId;
        String name;
        String subject;
        String marksObtained;
        String progress;
        String lastUpdatedUser;
    }

这是我的脚步:

    @Bean
    public Step Step() throws Exception {
        return stepBuilderFactory.get("Step").<Student,Student>chunk(100)
                .reader(jdbcPagingItemReader())
                .processor(studentitemprocessor)
                .writer(compositeItemWriter())
                .build();
    }

这是我的复合项作家:

    @Bean
        public CompositeItemWriter<Student> compositeItemWriter() throws Exception { 
            return new CompositeItemWriterBuilder<Student>()
                    .delegates(Arrays.asList(fileItemWriter(),studentUpdateItemWriter()))
                    .build();
        }

这是我用来与 DatabaseItemWriter。

    @Bean
    public JdbcBatchItemWriter<Student> studentUpdateItemWriter() {
        return new DatabaseItemWriter(dataSource,jdbcTemplate);
    }

这是我的JDBCBatchItemWriter,用于更新数据库上的记录,但出现错误

    @Bean
        public JdbcBatchItemWriter<Student> DatabaseItemWriter(DataSource dataSource,NamedParameterJdbcTemplate jdbcTemplate) {        
            JdbcBatchItemWriter<Student> itemWriter = new JdbcBatchItemWriter<>();
    
            itemWriter.setDataSource(this.dataSource);
            itemWriter.setsql(
                    "UPDATE dbo.student_record SET subject = 'Science',last_updated_user = 'BatchAppln' WHERE Student_Id = :studentId ");
            itemWriter.setAssertUpdates(false);
            itemWriter.setItemsqlParameterSourceProvider(new ItemsqlParameterSourceProvider<Student>() {
    
                @Override
                public sqlParameterSource createsqlParameterSource(Student item) {
                    return new MapsqlParameterSource().addValue("studentId",item.getStudentId());
                }
                
            });
            itemWriter.afterPropertiesSet();
            return itemWriter;
        }

现在,当我执行应用程序时,出现错误。这是堆栈跟踪:

    org.springframework.dao.InvalidDataAccessApiUsageException: No value supplied for the sql parameter '5': Invalid property '48' of bean class [com.student.record.model.Student]: Bean property '5' is not readable or has an invalid getter method: Does the return type of the getter match the parameter type of the setter?
        at org.springframework.jdbc.core.namedparam.NamedParameterUtils.buildValueArray(NamedParameterUtils.java:354) ~[spring-jdbc-5.2.9.RELEASE.jar:5.2.9.RELEASE]
        at org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate$2.setValues(NamedParameterJdbcTemplate.java:371) ~[spring-jdbc-5.2.9.RELEASE.jar:5.2.9.RELEASE]
        at org.springframework.jdbc.core.JdbcTemplate.lambda$batchUpdate$2(JdbcTemplate.java:944) ~[spring-jdbc-5.2.9.RELEASE.jar:5.2.9.RELEASE]
        at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:617) ~[spring-jdbc-5.2.9.RELEASE.jar:5.2.9.RELEASE]
        at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:647) ~[spring-jdbc-5.2.9.RELEASE.jar:5.2.9.RELEASE]
        at org.springframework.jdbc.core.JdbcTemplate.batchUpdate(JdbcTemplate.java:936) ~[spring-jdbc-5.2.9.RELEASE.jar:5.2.9.RELEASE]
        at org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate.batchUpdate(NamedParameterJdbcTemplate.java:366) ~[spring-jdbc-5.2.9.RELEASE.jar:5.2.9.RELEASE]
        at org.springframework.batch.item.database.JdbcBatchItemWriter.write(JdbcBatchItemWriter.java:182) ~[spring-batch-infrastructure-4.2.4.RELEASE.jar:4.2.4.RELEASE]
        at org.springframework.batch.item.support.CompositeItemWriter.write(CompositeItemWriter.java:59) ~[spring-batch-infrastructure-4.2.4.RELEASE.jar:4.2.4.RELEASE]
        at org.springframework.batch.core.step.item.SimpleChunkProcessor.writeItems(SimpleChunkProcessor.java:193) ~[spring-batch-core-4.2.4.RELEASE.jar:4.2.4.RELEASE]
        at org.springframework.batch.core.step.item.SimpleChunkProcessor.doWrite(SimpleChunkProcessor.java:159) ~[spring-batch-core-4.2.4.RELEASE.jar:4.2.4.RELEASE]
        at org.springframework.batch.core.step.item.SimpleChunkProcessor.write(SimpleChunkProcessor.java:294) ~[spring-batch-core-4.2.4.RELEASE.jar:4.2.4.RELEASE]
        at org.springframework.batch.core.step.item.SimpleChunkProcessor.process(SimpleChunkProcessor.java:217) ~[spring-batch-core-4.2.4.RELEASE.jar:4.2.4.RELEASE]
        at org.springframework.batch.core.step.item.ChunkOrientedtasklet.execute(ChunkOrientedtasklet.java:77) ~[spring-batch-core-4.2.4.RELEASE.jar:4.2.4.RELEASE]
        at org.springframework.batch.core.step.tasklet.taskletStep$ChunkTransactionCallback.doInTransaction(taskletStep.java:407) ~[spring-batch-core-4.2.4.RELEASE.jar:4.2.4.RELEASE]
        at org.springframework.batch.core.step.tasklet.taskletStep$ChunkTransactionCallback.doInTransaction(taskletStep.java:331) ~[spring-batch-core-4.2.4.RELEASE.jar:4.2.4.RELEASE]
        at org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:140) ~[spring-tx-5.2.9.RELEASE.jar:5.2.9.RELEASE]
        at org.springframework.batch.core.step.tasklet.taskletStep$2.doInChunkContext(taskletStep.java:273) ~[spring-batch-core-4.2.4.RELEASE.jar:4.2.4.RELEASE]
        at org.springframework.batch.core.scope.context.StepContextRepeatCallback.doInIteration(StepContextRepeatCallback.java:82) ~[spring-batch-core-4.2.4.RELEASE.jar:4.2.4.RELEASE]
        at org.springframework.batch.repeat.support.RepeatTemplate.getNextResult(RepeatTemplate.java:375) ~[spring-batch-infrastructure-4.2.4.RELEASE.jar:4.2.4.RELEASE]
        at org.springframework.batch.repeat.support.RepeatTemplate.executeInternal(RepeatTemplate.java:215) ~[spring-batch-infrastructure-4.2.4.RELEASE.jar:4.2.4.RELEASE]
        at org.springframework.batch.repeat.support.RepeatTemplate.iterate(RepeatTemplate.java:145) ~[spring-batch-infrastructure-4.2.4.RELEASE.jar:4.2.4.RELEASE]
        at org.springframework.batch.core.step.tasklet.taskletStep.doExecute(taskletStep.java:258) ~[spring-batch-core-4.2.4.RELEASE.jar:4.2.4.RELEASE]
        at org.springframework.batch.core.step.AbstractStep.execute(AbstractStep.java:208) ~[spring-batch-core-4.2.4.RELEASE.jar:4.2.4.RELEASE]
        at org.springframework.batch.core.partition.support.TaskExecutorPartitionHandler$1.call(TaskExecutorPartitionHandler.java:138) ~[spring-batch-core-4.2.4.RELEASE.jar:4.2.4.RELEASE]
        at org.springframework.batch.core.partition.support.TaskExecutorPartitionHandler$1.call(TaskExecutorPartitionHandler.java:135) ~[spring-batch-core-4.2.4.RELEASE.jar:4.2.4.RELEASE]
        at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264) ~[na:na]
        at java.base/java.lang.Thread.run(Thread.java:834) ~[na:na]

根据错误,我没有为第5个参数提供值,但是在我的JDBCItemWriter中,我在where子句中仅需要1个值,因此在where子句中仅提供了1个值。我正在那里映射那个1值,但是我不确定从哪里试图映射第5个值,而且这个数字5也不一致。有时会抱怨没有同时提供第二,第三或第四值。

此外,我确保要尝试映射的POJO中的第一个值始终具有一个值,并且我也尝试使用BeanPropertyItemsqlParameterSourceProviderItemPreparedStatementSetter对其进行映射。

有人可以解释为什么我会收到该错误以及如何解决错误

谢谢。

编辑:进行注释中指定的更改后,我得到

    org.springframework.dao.InvalidDataAccessApiUsageException: No value supplied for the sql parameter '05': No value registered for key '05'
        at org.springframework.jdbc.core.namedparam.NamedParameterUtils.buildValueArray(NamedParameterUtils.java:354) ~[spring-jdbc-5.2.9.RELEASE.jar:5.2.9.RELEASE]
        at org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate$2.setValues(NamedParameterJdbcTemplate.java:371) ~[spring-jdbc-5.2.9.RELEASE.jar:5.2.9.RELEASE]
        at org.springframework.jdbc.core.JdbcTemplate.lambda$batchUpdate$2(JdbcTemplate.java:944) ~[spring-jdbc-5.2.9.RELEASE.jar:5.2.9.RELEASE]
        at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:617) ~[spring-jdbc-5.2.9.RELEASE.jar:5.2.9.RELEASE]
        at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:647) ~[spring-jdbc-5.2.9.RELEASE.jar:5.2.9.RELEASE]
        at org.springframework.jdbc.core.JdbcTemplate.batchUpdate(JdbcTemplate.java:936) ~[spring-jdbc-5.2.9.RELEASE.jar:5.2.9.RELEASE]
        at org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate.batchUpdate(NamedParameterJdbcTemplate.java:366) ~[spring-jdbc-5.2.9.RELEASE.jar:5.2.9.RELEASE]
        at org.springframework.batch.item.database.JdbcBatchItemWriter.write(JdbcBatchItemWriter.java:182) ~[spring-batch-infrastructure-4.2.4.RELEASE.jar:4.2.4.RELEASE]
        at org.springframework.batch.item.support.CompositeItemWriter.write(CompositeItemWriter.java:59) ~[spring-batch-infrastructure-4.2.4.RELEASE.jar:4.2.4.RELEASE]
        at org.springframework.batch.core.step.item.SimpleChunkProcessor.writeItems(SimpleChunkProcessor.java:193) ~[spring-batch-core-4.2.4.RELEASE.jar:4.2.4.RELEASE]
        at org.springframework.batch.core.step.item.SimpleChunkProcessor.doWrite(SimpleChunkProcessor.java:159) ~[spring-batch-core-4.2.4.RELEASE.jar:4.2.4.RELEASE]
        at org.springframework.batch.core.step.item.SimpleChunkProcessor.write(SimpleChunkProcessor.java:294) ~[spring-batch-core-4.2.4.RELEASE.jar:4.2.4.RELEASE]
        at org.springframework.batch.core.step.item.SimpleChunkProcessor.process(SimpleChunkProcessor.java:217) ~[spring-batch-core-4.2.4.RELEASE.jar:4.2.4.RELEASE]
        at org.springframework.batch.core.step.item.ChunkOrientedtasklet.execute(ChunkOrientedtasklet.java:77) ~[spring-batch-core-4.2.4.RELEASE.jar:4.2.4.RELEASE]
        at org.springframework.batch.core.step.tasklet.taskletStep$ChunkTransactionCallback.doInTransaction(taskletStep.java:407) ~[spring-batch-core-4.2.4.RELEASE.jar:4.2.4.RELEASE]
        at org.springframework.batch.core.step.tasklet.taskletStep$ChunkTransactionCallback.doInTransaction(taskletStep.java:331) ~[spring-batch-core-4.2.4.RELEASE.jar:4.2.4.RELEASE]
        at org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:140) ~[spring-tx-5.2.9.RELEASE.jar:5.2.9.RELEASE]
        at org.springframework.batch.core.step.tasklet.taskletStep$2.doInChunkContext(taskletStep.java:273) ~[spring-batch-core-4.2.4.RELEASE.jar:4.2.4.RELEASE]
        at org.springframework.batch.core.scope.context.StepContextRepeatCallback.doInIteration(StepContextRepeatCallback.java:82) ~[spring-batch-core-4.2.4.RELEASE.jar:4.2.4.RELEASE]
        at org.springframework.batch.repeat.support.RepeatTemplate.getNextResult(RepeatTemplate.java:375) ~[spring-batch-infrastructure-4.2.4.RELEASE.jar:4.2.4.RELEASE]
        at org.springframework.batch.repeat.support.RepeatTemplate.executeInternal(RepeatTemplate.java:215) ~[spring-batch-infrastructure-4.2.4.RELEASE.jar:4.2.4.RELEASE]
        at org.springframework.batch.repeat.support.RepeatTemplate.iterate(RepeatTemplate.java:145) ~[spring-batch-infrastructure-4.2.4.RELEASE.jar:4.2.4.RELEASE]
        at org.springframework.batch.core.step.tasklet.taskletStep.doExecute(taskletStep.java:258) ~[spring-batch-core-4.2.4.RELEASE.jar:4.2.4.RELEASE]
        at org.springframework.batch.core.step.AbstractStep.execute(AbstractStep.java:208) ~[spring-batch-core-4.2.4.RELEASE.jar:4.2.4.RELEASE]
        at org.springframework.batch.core.partition.support.TaskExecutorPartitionHandler$1.call(TaskExecutorPartitionHandler.java:138) ~[spring-batch-core-4.2.4.RELEASE.jar:4.2.4.RELEASE]
        at org.springframework.batch.core.partition.support.TaskExecutorPartitionHandler$1.call(TaskExecutorPartitionHandler.java:135) ~[spring-batch-core-4.2.4.RELEASE.jar:4.2.4.RELEASE]
        at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264) ~[na:na]
        at java.base/java.lang.Thread.run(Thread.java:834) ~[na:na]

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)