I am trying to use the @JsonIdentityInfo from Jackson 2 as described here.
For testing purposes I created the following two classes:
public class A
{
It seems jackson-jr has a subset of Jackson's features. @JsonIdentityInfo
must not have made the cut.
If you can use the full Jackson library, just use a standard ObjectMapper
with the @JsonIdentityInfo
annotation you suggested in your question and serialize your object. For example
@JsonIdentityInfo(generator=ObjectIdGenerators.IntSequenceGenerator.class, property="@id")
public class A {/* all that good stuff */}
@JsonIdentityInfo(generator=ObjectIdGenerators.IntSequenceGenerator.class, property="@id")
public class B {/* all that good stuff */}
and then
A a = new A();
B b = new B(a);
a.setB(b);
ObjectMapper mapper = new ObjectMapper();
System.out.println(mapper.writeValueAsString(a));
will generate
{
"@id": 1,
"b": {
"@id": 2,
"a": 1
}
}
where the nested a
is referring to the root object by its @id
.
In some cases, it can be necessary to annotate the Id Property with @JsonProperty("id")
For example, in my case, this made my application run correctly.
There are several approaches to solve this circular references or infinite recursion issues. This link explain in details each one. I have solved my issues including @JsonIdentityInfo annotation above each related entity, although @JsonView is more recent and may it's a better solution depending of your scenery.
@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id")
Or using an IntSequenceGenerator implementation:
@JsonIdentityInfo(generator=ObjectIdGenerators.IntSequenceGenerator.class)
@Entity
public class A implements Serializable
...