diff --git a/spring-integration-core/src/main/java/org/springframework/integration/transformer/ObjectToMapTransformer.java b/spring-integration-core/src/main/java/org/springframework/integration/transformer/ObjectToMapTransformer.java index 3433fc150f..f7d640c37c 100644 --- a/spring-integration-core/src/main/java/org/springframework/integration/transformer/ObjectToMapTransformer.java +++ b/spring-integration-core/src/main/java/org/springframework/integration/transformer/ObjectToMapTransformer.java @@ -44,6 +44,8 @@ public class ObjectToMapTransformer extends AbstractPayloadTransformer transformPayload(Object payload) throws Exception { + CycleDetector cycleDetector = new CycleDetector(); + cycleDetector.detectCycle(payload); ObjectToSpelMapBuilder builder = new ObjectToSpelMapBuilder(); return builder.buildSpelMap(payload); } diff --git a/spring-integration-core/src/test/java/org/springframework/integration/transformer/ObjectToMapTransformerTests.java b/spring-integration-core/src/test/java/org/springframework/integration/transformer/ObjectToMapTransformerTests.java index f6464ab7dc..a84f344cee 100644 --- a/spring-integration-core/src/test/java/org/springframework/integration/transformer/ObjectToMapTransformerTests.java +++ b/spring-integration-core/src/test/java/org/springframework/integration/transformer/ObjectToMapTransformerTests.java @@ -62,6 +62,17 @@ public class ObjectToMapTransformerTests { assertEquals(valueFromTheMap, valueFromExpression); } } + @Test(expected=MessageTransformationException.class) + public void testObjectToSpelMapTransformerWithCycle(){ + Employee employee = this.buildEmployee(); + Child child = new Child(); + Person parent = employee.getPerson(); + parent.setChild(child); + child.setParent(parent); + ObjectToMapTransformer transformer = new ObjectToMapTransformer(); + Message message = MessageBuilder.withPayload(employee).build(); + transformer.transform(message); + } @SuppressWarnings("unchecked") public Employee buildEmployee(){ @@ -168,6 +179,13 @@ public class ObjectToMapTransformerTests { private String lname; private String[] akaNames; private List> remarks; + private Child child; + public Child getChild() { + return child; + } + public void setChild(Child child) { + this.child = child; + } public List> getRemarks() { return remarks; } @@ -238,4 +256,16 @@ public class ObjectToMapTransformerTests { this.coordinates = coordinates; } } + + public static class Child { + private Person parent; + + public Person getParent() { + return parent; + } + + public void setParent(Person parent) { + this.parent = parent; + } + } }