diff --git a/spring-batch-core/src/main/java/org/springframework/batch/core/resource/JobParametersPreparedStatementSetter.java b/spring-batch-core/src/main/java/org/springframework/batch/core/resource/StepExecutionPreparedStatementSetter.java similarity index 83% rename from spring-batch-core/src/main/java/org/springframework/batch/core/resource/JobParametersPreparedStatementSetter.java rename to spring-batch-core/src/main/java/org/springframework/batch/core/resource/StepExecutionPreparedStatementSetter.java index 8182e4c1a..32a2dba55 100644 --- a/spring-batch-core/src/main/java/org/springframework/batch/core/resource/JobParametersPreparedStatementSetter.java +++ b/spring-batch-core/src/main/java/org/springframework/batch/core/resource/StepExecutionPreparedStatementSetter.java @@ -24,6 +24,7 @@ import org.springframework.batch.core.JobParameters; import org.springframework.batch.core.StepExecution; import org.springframework.batch.core.StepExecutionListener; import org.springframework.batch.core.listener.StepExecutionListenerSupport; +import org.springframework.batch.item.ExecutionContext; import org.springframework.beans.factory.InitializingBean; import org.springframework.jdbc.core.PreparedStatementSetter; import org.springframework.jdbc.core.SqlTypeValue; @@ -38,18 +39,23 @@ import org.springframework.util.Assert; * @author Lucas Ward * */ -public class JobParametersPreparedStatementSetter extends StepExecutionListenerSupport implements +public class StepExecutionPreparedStatementSetter extends StepExecutionListenerSupport implements PreparedStatementSetter, InitializingBean { private List parameterKeys; private JobParameters jobParameters; + private ExecutionContext executionContext; public void setValues(PreparedStatement ps) throws SQLException { Map parameters = jobParameters.getParameters(); for(int i = 0; i < parameterKeys.size(); i++){ - Object arg = parameters.get(parameterKeys.get(i)); + String parameterKey = parameterKeys.get(i).toString(); + Object arg = executionContext.get(parameterKey); if(arg == null){ - throw new IllegalStateException("No job parameter found for with key of: [" + parameterKeys.get(i) + "]"); + arg = parameters.get(parameterKey); + if(arg == null){ + throw new IllegalStateException("No job parameter found for with key of: [" + parameterKeys.get(i) + "]"); + } } StatementCreatorUtils.setParameterValue(ps, i + 1, SqlTypeValue.TYPE_UNKNOWN, arg); } @@ -57,6 +63,7 @@ public class JobParametersPreparedStatementSetter extends StepExecutionListenerS public void beforeStep(StepExecution stepExecution) { this.jobParameters = stepExecution.getJobParameters(); + this.executionContext = stepExecution.getExecutionContext(); } /** diff --git a/spring-batch-core/src/test/java/org/springframework/batch/core/resource/JdbcCursorItemReaderPreparedStatementIntegrationTests.java b/spring-batch-core/src/test/java/org/springframework/batch/core/resource/JdbcCursorItemReaderPreparedStatementIntegrationTests.java index 7d93b5380..6d29afae8 100644 --- a/spring-batch-core/src/test/java/org/springframework/batch/core/resource/JdbcCursorItemReaderPreparedStatementIntegrationTests.java +++ b/spring-batch-core/src/test/java/org/springframework/batch/core/resource/JdbcCursorItemReaderPreparedStatementIntegrationTests.java @@ -32,7 +32,7 @@ public class JdbcCursorItemReaderPreparedStatementIntegrationTests extends itemReader.setMaxRows(100); itemReader.setQueryTimeout(1000); itemReader.setSaveState(true); - JobParametersPreparedStatementSetter pss = new JobParametersPreparedStatementSetter(); + StepExecutionPreparedStatementSetter pss = new StepExecutionPreparedStatementSetter(); JobParameters jobParameters = new JobParametersBuilder().addLong("begin.id", new Long(1)).addLong("end.id", new Long(4)).toJobParameters(); JobInstance jobInstance = new JobInstance(new Long(1), jobParameters, new SimpleJob()); JobExecution jobExecution = new JobExecution(jobInstance, new Long(2)); diff --git a/spring-batch-core/src/test/java/org/springframework/batch/core/resource/JobParametersPreparedStatementSetterTests.java b/spring-batch-core/src/test/java/org/springframework/batch/core/resource/JobParametersPreparedStatementSetterTests.java index f0d197e3c..a1bd13964 100644 --- a/spring-batch-core/src/test/java/org/springframework/batch/core/resource/JobParametersPreparedStatementSetterTests.java +++ b/spring-batch-core/src/test/java/org/springframework/batch/core/resource/JobParametersPreparedStatementSetterTests.java @@ -27,6 +27,7 @@ import org.springframework.batch.core.JobParametersBuilder; import org.springframework.batch.core.StepExecution; import org.springframework.batch.core.job.SimpleJob; import org.springframework.batch.core.step.tasklet.TaskletStep; +import org.springframework.batch.item.ExecutionContext; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.RowCallbackHandler; import org.springframework.test.AbstractTransactionalDataSourceSpringContextTests; @@ -38,7 +39,8 @@ import org.springframework.test.AbstractTransactionalDataSourceSpringContextTest public class JobParametersPreparedStatementSetterTests extends AbstractTransactionalDataSourceSpringContextTests { JdbcTemplate jdbcTemplate; - JobParametersPreparedStatementSetter pss; + StepExecutionPreparedStatementSetter pss; + StepExecution stepExecution; protected String[] getConfigLocations() { return new String[] { "data-source-context.xml" }; @@ -47,11 +49,11 @@ public class JobParametersPreparedStatementSetterTests extends AbstractTransacti protected void onSetUpInTransaction() throws Exception { super.onSetUpInTransaction(); - pss = new JobParametersPreparedStatementSetter(); + pss = new StepExecutionPreparedStatementSetter(); JobParameters jobParameters = new JobParametersBuilder().addLong("begin.id", new Long(1)).addLong("end.id", new Long(4)).toJobParameters(); JobInstance jobInstance = new JobInstance(new Long(1), jobParameters, new SimpleJob()); JobExecution jobExecution = new JobExecution(jobInstance, new Long(2)); - StepExecution stepExecution = new StepExecution(new TaskletStep(), jobExecution, new Long(3) ); + stepExecution = new StepExecution(new TaskletStep(), jobExecution, new Long(3) ); pss.beforeStep(stepExecution); jdbcTemplate = getJdbcTemplate(); } @@ -104,4 +106,27 @@ public class JobParametersPreparedStatementSetterTests extends AbstractTransacti } } + + public void testMixedProperties(){ + + ExecutionContext executionContext = new ExecutionContext(); + executionContext.putLong("begin.id", 2); + stepExecution.setExecutionContext(executionContext); + pss.beforeStep(stepExecution); + + List parameterNames = new ArrayList(); + parameterNames.add("begin.id"); + parameterNames.add("end.id"); + pss.setParameterKeys(parameterNames); + + final List results = new ArrayList(); + jdbcTemplate.query("SELECT NAME from T_FOOS where ID > ? and ID < ?", pss, new RowCallbackHandler(){ + + public void processRow(ResultSet rs) throws SQLException { + results.add(rs.getString(1)); + }}); + + assertEquals(1, results.size()); + assertEquals("bar3", results.get(0)); + } }