Added failing test about defensive copying with object id.
diff --git a/src/test/java/com/fasterxml/jackson/databind/struct/TestObjectIdDeserialization.java b/src/test/java/com/fasterxml/jackson/databind/struct/TestObjectIdDeserialization.java
index ec7ed7e..4f39697 100644
--- a/src/test/java/com/fasterxml/jackson/databind/struct/TestObjectIdDeserialization.java
+++ b/src/test/java/com/fasterxml/jackson/databind/struct/TestObjectIdDeserialization.java
@@ -1,5 +1,6 @@
package com.fasterxml.jackson.databind.struct;
+import java.util.ArrayList;
import java.util.EnumMap;
import java.util.HashMap;
import java.util.Iterator;
@@ -135,6 +136,18 @@
}
}
+ static class DefensiveCompany {
+ public List<DefensiveEmployee> employees;
+
+ static class DefensiveEmployee extends Employee {
+
+ public void setReports(List<DefensiveEmployee> reports)
+ {
+ this.reports = new ArrayList<TestObjectId.Employee>(reports);
+ }
+ }
+ }
+
@JsonIdentityInfo(generator = ObjectIdGenerators.IntSequenceGenerator.class)
static class AnySetterObjectId {
private Map<String, AnySetterObjectId> values = new HashMap<String, AnySetterObjectId>();
@@ -304,10 +317,23 @@
assertEmployees(firstEmployee, secondEmployee);
}
+ public void testForwardReferenceWithDefensiveCopy()
+ throws Exception
+ {
+ String json = "{\"employees\":[" + "{\"id\":1,\"name\":\"First\",\"manager\":null,\"reports\":[2]},"
+ + "{\"id\":2,\"name\":\"Second\",\"manager\":1,\"reports\":[]}" + "]}";
+ DefensiveCompany company = mapper.readValue(json, DefensiveCompany.class);
+ assertEquals(2, company.employees.size());
+ Employee firstEmployee = company.employees.get(0);
+ Employee secondEmployee = company.employees.get(1);
+ assertEmployees(firstEmployee, secondEmployee);
+ }
+
private void assertEmployees(Employee firstEmployee, Employee secondEmployee)
{
assertEquals(1, firstEmployee.id);
assertEquals(2, secondEmployee.id);
+ assertEquals(1, firstEmployee.reports.size());
assertSame(secondEmployee, firstEmployee.reports.get(0)); // Ensure that forward reference was properly resolved and in order.
assertSame(firstEmployee, secondEmployee.manager); // And that back reference is also properly resolved.
}