diff --git a/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/ExecutionContext.java b/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/ExecutionContext.java index 661ed65b2..03723f869 100644 --- a/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/ExecutionContext.java +++ b/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/ExecutionContext.java @@ -125,12 +125,13 @@ public class ExecutionContext implements Serializable { public void put(String key, Object value) { if (value != null) { Assert.isInstanceOf(Serializable.class, value, "Value: [ " + value + "must be serializable."); - map.put(key, value); + Object result = map.put(key, value); + dirty = result==null || result!=null && !result.equals(value); } else { - map.remove(key); + Object result = map.remove(key); + dirty = result!=null; } - dirty = true; } /** diff --git a/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/ExecutionContextTests.java b/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/ExecutionContextTests.java index 719596c5c..fd7ef8f9e 100644 --- a/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/ExecutionContextTests.java +++ b/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/ExecutionContextTests.java @@ -89,6 +89,25 @@ public class ExecutionContextTests { assertFalse(context.isDirty()); } + @Test + public void testNotDirtyWithDuplicate() { + context.putString("1", "test"); + assertTrue(context.isDirty()); + context.clearDirtyFlag(); + context.putString("1", "test"); + assertFalse(context.isDirty()); + } + + @Test + public void testNotDirtyWithRemoveMissing() { + context.putString("1", "test"); + assertTrue(context.isDirty()); + context.putString("1", null); // remove an item that was present + assertTrue(context.isDirty()); + context.putString("1", null); // remove a non-existent item + assertFalse(context.isDirty()); + } + @Test public void testContains() { context.putString("1", "testString");