package com.fasterxml.jackson.databind.struct;
import java.io.IOException;
import com.fasterxml.jackson.annotation.*;
import com.fasterxml.jackson.databind.BaseMapTest;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
/**
* Test for testing forward reference handling
*/
public class TestForwardReference extends BaseMapTest {
private final ObjectMapper MAPPER = new ObjectMapper()
.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
.enable(SerializationFeature.INDENT_OUTPUT)
.setSerializationInclusion(JsonInclude.Include.NON_NULL);
/** Tests that we can read a hierarchical structure with forward references*/
public void testForwardRef() throws IOException {
MAPPER.readValue("{" +
" \"@type\" : \"TestForwardReference$ForwardReferenceContainerClass\"," +
" \"frc\" : \"willBeForwardReferenced\"," +
" \"yac\" : {" +
" \"@type\" : \"TestForwardReference$YetAnotherClass\"," +
" \"frc\" : {" +
" \"@type\" : \"One\"," +
" \"id\" : \"willBeForwardReferenced\"" +
" }," +
" \"id\" : \"anId\"" +
" }," +
" \"id\" : \"ForwardReferenceContainerClass1\"" +
"}", ForwardReferenceContainerClass.class);
}
@JsonTypeInfo(use=JsonTypeInfo.Id.NAME, include= JsonTypeInfo.As.PROPERTY)
public static class ForwardReferenceContainerClass
{
public ForwardReferenceClass frc;
public YetAnotherClass yac;
public String id;
}
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY)
@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id")
@JsonSubTypes({
@JsonSubTypes.Type(value = ForwardReferenceClassOne.class, name = "One"),
@JsonSubTypes.Type(value = ForwardReferenceClassTwo.class, name = "Two")})
static abstract class ForwardReferenceClass
{
public String id;
public void setId(String id) {
this.id = id;
}
}
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY)
static class YetAnotherClass
{
public YetAnotherClass() {}
public ForwardReferenceClass frc;
public String id;
}
public static class ForwardReferenceClassOne extends ForwardReferenceClass { }
public static class ForwardReferenceClassTwo extends ForwardReferenceClass { }
}