package com.fasterxml.jackson.failing; import com.fasterxml.jackson.annotation.*; import com.fasterxml.jackson.databind.*; // This is probably impossible to handle, in general case, since // there is a cycle for Parent2/Child2... unless special handling // could be made to ensure that public class TestObjectIdWithInjectables639 extends BaseMapTest { public static final class Context { } @JsonIdentityInfo(generator = ObjectIdGenerators.IntSequenceGenerator.class) public static final class Parent1 { public Child1 child; public Parent1() { } } @JsonIdentityInfo(generator = ObjectIdGenerators.IntSequenceGenerator.class) public static final class Child1 { @JsonProperty private final Parent1 parent; @JsonCreator public Child1(@JsonProperty("parent") Parent1 parent) { this.parent = parent; } } @JsonIdentityInfo(generator = ObjectIdGenerators.IntSequenceGenerator.class) public static final class Parent2 { protected final Context context; public Child2 child; @JsonCreator public Parent2(@JacksonInject Context context) { this.context = context; } } @JsonIdentityInfo(generator = ObjectIdGenerators.IntSequenceGenerator.class) public static final class Child2 { protected final Context context; @JsonProperty protected Parent2 parent; @JsonCreator public Child2(@JacksonInject Context context, @JsonProperty("parent") Parent2 parent) { this.context = context; this.parent = parent; } } public void testObjectIdWithInjectables() throws Exception { ObjectMapper mapper = new ObjectMapper(); Context context = new Context(); InjectableValues iv = new InjectableValues.Std(). addValue(Context.class, context); mapper.setInjectableValues(iv); Parent1 parent1 = new Parent1(); Child1 child1 = new Child1(parent1); parent1.child = child1; Parent2 parent2 = new Parent2(context); Child2 child2 = new Child2(context, parent2); parent2.child = child2; String json = mapper.writeValueAsString(parent1); parent1 = mapper.readValue(json, Parent1.class); // System.out.println("This works: " + json); json = mapper.writeValueAsString(parent2); //System.out.println("This fails: " + json); parent2 = mapper.readValue(json, Parent2.class); } }