From f4e7d51e41a6ea0d8afcf9eb5944041c0f7b5845 Mon Sep 17 00:00:00 2001 From: Michael Minella Date: Fri, 2 Jun 2017 17:17:53 -0500 Subject: [PATCH] Align XML and Java based configuration This commit aligns the XML and Java based validations. When using XML to configure a chunk oriented step both an ItemReader and ItemWriter are requied. However when using Java based configuration the ItemWriter is optional if an ItemProcessor is present. Having no ItemWriter and only an ItemProcessor lead to strange results in one of our batch jobs, which was accidentily configured without an ItemProcessor. Related: BATCH-1520 Fixes: BATCH-2624 --- .../builder/FaultTolerantStepBuilder.java | 4 +-- .../core/step/builder/SimpleStepBuilder.java | 4 +-- .../FaultTolerantStepFactoryBeanTests.java | 26 +---------------- .../step/item/SimpleStepFactoryBeanTests.java | 29 ++----------------- 4 files changed, 7 insertions(+), 56 deletions(-) diff --git a/spring-batch-core/src/main/java/org/springframework/batch/core/step/builder/FaultTolerantStepBuilder.java b/spring-batch-core/src/main/java/org/springframework/batch/core/step/builder/FaultTolerantStepBuilder.java index cfe440fa05..8066943aef 100644 --- a/spring-batch-core/src/main/java/org/springframework/batch/core/step/builder/FaultTolerantStepBuilder.java +++ b/spring-batch-core/src/main/java/org/springframework/batch/core/step/builder/FaultTolerantStepBuilder.java @@ -178,7 +178,7 @@ protected void registerStepListenerAsSkipListener() { @Override protected Tasklet createTasklet() { Assert.state(getReader() != null, "ItemReader must be provided"); - Assert.state(getProcessor() != null || getWriter() != null, "ItemWriter or ItemProcessor must be provided"); + Assert.state(getWriter() != null, "ItemWriter must be provided"); addSpecialExceptions(); registerSkipListeners(); ChunkProvider chunkProvider = createChunkProvider(); @@ -772,6 +772,6 @@ public boolean equals(Object obj) { } return chunkListener.equals(obj); } - + } } diff --git a/spring-batch-core/src/main/java/org/springframework/batch/core/step/builder/SimpleStepBuilder.java b/spring-batch-core/src/main/java/org/springframework/batch/core/step/builder/SimpleStepBuilder.java index f25f454d9d..ca2a8ee433 100644 --- a/spring-batch-core/src/main/java/org/springframework/batch/core/step/builder/SimpleStepBuilder.java +++ b/spring-batch-core/src/main/java/org/springframework/batch/core/step/builder/SimpleStepBuilder.java @@ -1,5 +1,5 @@ /* - * Copyright 2006-2014 the original author or authors. + * Copyright 2006-2017 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -156,7 +156,7 @@ private void checkAndAddItemListener(StepListener stepListener) { @Override protected Tasklet createTasklet() { Assert.state(reader != null, "ItemReader must be provided"); - Assert.state(processor != null || writer != null, "ItemWriter or ItemProcessor must be provided"); + Assert.state(writer != null, "ItemWriter must be provided"); RepeatOperations repeatOperations = createChunkOperations(); SimpleChunkProvider chunkProvider = new SimpleChunkProvider<>(getReader(), repeatOperations); SimpleChunkProcessor chunkProcessor = new SimpleChunkProcessor<>(getProcessor(), getWriter()); diff --git a/spring-batch-core/src/test/java/org/springframework/batch/core/step/item/FaultTolerantStepFactoryBeanTests.java b/spring-batch-core/src/test/java/org/springframework/batch/core/step/item/FaultTolerantStepFactoryBeanTests.java index 1c1da512df..4e8b12d585 100644 --- a/spring-batch-core/src/test/java/org/springframework/batch/core/step/item/FaultTolerantStepFactoryBeanTests.java +++ b/spring-batch-core/src/test/java/org/springframework/batch/core/step/item/FaultTolerantStepFactoryBeanTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2008-2014 the original author or authors. + * Copyright 2008-2017 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -372,30 +372,6 @@ public void testProcessFilter() throws Exception { .getName())); } - @Test - public void testNullWriter() throws Exception { - - factory.setItemWriter(null); - Step step = factory.getObject(); - - step.execute(stepExecution); - - assertEquals(0, stepExecution.getSkipCount()); - assertEquals(0, stepExecution.getReadSkipCount()); - assertEquals(5, stepExecution.getReadCount()); - // Write count is incremented even if nothing happens - assertEquals(5, stepExecution.getWriteCount()); - assertEquals(0, stepExecution.getFilterCount()); - assertEquals(0, stepExecution.getRollbackCount()); - - // writer skips "4" - assertTrue(reader.getRead().contains("4")); - - assertEquals(BatchStatus.COMPLETED, stepExecution.getStatus()); - assertStepExecutionsAreEqual(stepExecution, repository.getLastStepExecution(jobExecution.getJobInstance(), step - .getName())); - } - /** * Check items causing errors are skipped as expected. */ diff --git a/spring-batch-core/src/test/java/org/springframework/batch/core/step/item/SimpleStepFactoryBeanTests.java b/spring-batch-core/src/test/java/org/springframework/batch/core/step/item/SimpleStepFactoryBeanTests.java index b272df36f6..46e2417711 100644 --- a/spring-batch-core/src/test/java/org/springframework/batch/core/step/item/SimpleStepFactoryBeanTests.java +++ b/spring-batch-core/src/test/java/org/springframework/batch/core/step/item/SimpleStepFactoryBeanTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2006-2013 the original author or authors. + * Copyright 2006-2017 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -27,6 +27,7 @@ import java.util.List; import org.junit.Before; +import org.junit.Ignore; import org.junit.Test; import org.springframework.batch.core.BatchStatus; import org.springframework.batch.core.ChunkListener; @@ -475,32 +476,6 @@ public void onWriteError(Exception exception, List items) { } - @Test - public void testNullWriter() throws Exception { - - SimpleStepFactoryBean factory = getStepFactory(new String[] { "foo", "bar", "spam" }); - factory.setItemWriter(null); - factory.setItemProcessor(new ItemProcessor() { - @Override - public String process(String item) throws Exception { - written.add(item); - return null; - } - }); - - Step step = factory.getObject(); - - job.setSteps(Collections.singletonList(step)); - - JobExecution jobExecution = repository.createJobExecution(job.getName(), new JobParameters()); - - job.execute(jobExecution); - - assertEquals(BatchStatus.COMPLETED, jobExecution.getStatus()); - assertEquals("[foo, bar, spam]", written.toString()); - - } - private SimpleStepFactoryBean getStepFactory(String... args) throws Exception { SimpleStepFactoryBean factory = new SimpleStepFactoryBean();