diff --git a/spring-batch-infrastructure/src/main/java/org/springframework/batch/io/driving/DrivingQueryItemReader.java b/spring-batch-infrastructure/src/main/java/org/springframework/batch/io/driving/DrivingQueryItemReader.java index ef703b930..0c49fc742 100644 --- a/spring-batch-infrastructure/src/main/java/org/springframework/batch/io/driving/DrivingQueryItemReader.java +++ b/spring-batch-infrastructure/src/main/java/org/springframework/batch/io/driving/DrivingQueryItemReader.java @@ -22,6 +22,7 @@ import org.springframework.batch.item.ExecutionContext; import org.springframework.batch.item.ItemReader; import org.springframework.batch.item.ItemStream; import org.springframework.beans.factory.InitializingBean; +import org.springframework.dao.DataRetrievalFailureException; import org.springframework.util.Assert; /** @@ -139,6 +140,9 @@ public class DrivingQueryItemReader implements ItemReader, InitializingBean, Assert.state(keys == null && !initialized, "Cannot open an already opened input source" + ", call close() first."); keys = keyGenerator.retrieveKeys(executionContext); + if(keys == null || keys.size() == 0){ + throw new DataRetrievalFailureException("KeyGenerator must return at least 1 key"); + } keysIterator = keys.listIterator(); initialized = true; } diff --git a/spring-batch-infrastructure/src/test/java/org/springframework/batch/io/driving/DrivingQueryItemReaderTests.java b/spring-batch-infrastructure/src/test/java/org/springframework/batch/io/driving/DrivingQueryItemReaderTests.java index 4b7a6a631..8eeed6246 100644 --- a/spring-batch-infrastructure/src/test/java/org/springframework/batch/io/driving/DrivingQueryItemReaderTests.java +++ b/spring-batch-infrastructure/src/test/java/org/springframework/batch/io/driving/DrivingQueryItemReaderTests.java @@ -11,12 +11,13 @@ import org.springframework.batch.item.ItemReader; import org.springframework.batch.item.ItemStream; import org.springframework.batch.item.ExecutionContext; import org.springframework.beans.factory.InitializingBean; +import org.springframework.dao.DataRetrievalFailureException; import org.springframework.transaction.support.TransactionSynchronizationManager; import org.springframework.util.Assert; public class DrivingQueryItemReaderTests extends TestCase { - ItemReader itemReader; + DrivingQueryItemReader itemReader; static { TransactionSynchronizationManager.initSynchronization(); @@ -28,7 +29,7 @@ public class DrivingQueryItemReaderTests extends TestCase { itemReader = createItemReader(); } - private ItemReader createItemReader() throws Exception{ + private DrivingQueryItemReader createItemReader() throws Exception{ DrivingQueryItemReader inputSource = new DrivingQueryItemReader(); inputSource.setKeyGenerator(new MockKeyGenerator()); @@ -153,6 +154,26 @@ public class DrivingQueryItemReaderTests extends TestCase { assertEquals(foo2, itemReader.read()); } + + public void testRetriveZeroKeys(){ + + itemReader.setKeyGenerator(new KeyGenerator(){ + + public List retrieveKeys(ExecutionContext executionContext) { + return new ArrayList(); + } + + public void saveState(Object key, ExecutionContext executionContext) { + }}); + + try{ + itemReader.open(new ExecutionContext()); + fail(); + } + catch(DataRetrievalFailureException ex){ + //expected + } + } private void commit() {