From e2ff11603c750a91588ac8940b43c5424bc7bf31 Mon Sep 17 00:00:00 2001 From: Your Name Date: Mon, 10 Nov 2014 18:25:27 -0300 Subject: [PATCH 1/2] impl --- .../databind/deser/AbstractDeserializer.java | 3 +- .../databind/deser/TestForwardReference.java | 82 +++++++++++++++++++ 2 files changed, 84 insertions(+), 1 deletion(-) create mode 100644 src/test/java/com/fasterxml/jackson/databind/deser/TestForwardReference.java diff --git a/src/main/java/com/fasterxml/jackson/databind/deser/AbstractDeserializer.java b/src/main/java/com/fasterxml/jackson/databind/deser/AbstractDeserializer.java index b6f9299305..6b183294b1 100644 --- a/src/main/java/com/fasterxml/jackson/databind/deser/AbstractDeserializer.java +++ b/src/main/java/com/fasterxml/jackson/databind/deser/AbstractDeserializer.java @@ -195,9 +195,10 @@ protected Object _deserializeFromObjectId(JsonParser jp, DeserializationContext // do we have it resolved? Object pojo = roid.resolve(); if (pojo == null) { // not yet; should wait... - throw new IllegalStateException("Could not resolve Object Id ["+id+"] -- unresolved forward-reference?"); + throw new UnresolvedForwardReference("Could not resolve Object Id ["+id+"] -- unresolved forward-reference?", jp.getCurrentLocation(), roid); } return pojo; } } + diff --git a/src/test/java/com/fasterxml/jackson/databind/deser/TestForwardReference.java b/src/test/java/com/fasterxml/jackson/databind/deser/TestForwardReference.java new file mode 100644 index 0000000000..26858d6ea8 --- /dev/null +++ b/src/test/java/com/fasterxml/jackson/databind/deser/TestForwardReference.java @@ -0,0 +1,82 @@ +package com.fasterxml.jackson.databind.deser; + +import com.fasterxml.jackson.annotation.JsonIdentityInfo; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonSubTypes; +import com.fasterxml.jackson.annotation.JsonTypeInfo; +import com.fasterxml.jackson.annotation.ObjectIdGenerators; +import com.fasterxml.jackson.core.JsonParseException; +import com.fasterxml.jackson.databind.BaseMapTest; +import com.fasterxml.jackson.databind.DeserializationFeature; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.SerializationFeature; + +import java.io.IOException; +import java.util.List; + +/** + * 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\" : \"Two\"," + + " \"id\" : \"anotherInstance\"" + + " }, {" + + " \"@type\" : \"One\"," + + " \"id\" : \"willBeForwardReferenced\"" + + " } ]," + + " \"id\" : \"anId\"\n" + + " },\n" + + " \"id\" : \"ForwardReferenceContainerClass1\"\n" + + "}", 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")}) + private static abstract class ForwardReferenceClass + { + public String id; + public void setId(String id) { + this.id = id; + } + } + + @JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY) + private static class YetAnotherClass + { + public YetAnotherClass() {} + public List frc; + public String id; + } + + public static class ForwardReferenceClassOne extends ForwardReferenceClass { } + + public static class ForwardReferenceClassTwo extends ForwardReferenceClass { } +} From afa712277af5e93b6910cc82466e4ebd74b25ecd Mon Sep 17 00:00:00 2001 From: Your Name Date: Mon, 10 Nov 2014 18:33:04 -0300 Subject: [PATCH 2/2] improve test --- .../databind/deser/TestForwardReference.java | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/src/test/java/com/fasterxml/jackson/databind/deser/TestForwardReference.java b/src/test/java/com/fasterxml/jackson/databind/deser/TestForwardReference.java index 26858d6ea8..e4f0af5b7f 100644 --- a/src/test/java/com/fasterxml/jackson/databind/deser/TestForwardReference.java +++ b/src/test/java/com/fasterxml/jackson/databind/deser/TestForwardReference.java @@ -13,6 +13,7 @@ import com.fasterxml.jackson.databind.SerializationFeature; import java.io.IOException; +import java.util.ArrayList; import java.util.List; /** @@ -32,16 +33,13 @@ public void testForwardRef() throws IOException { " \"frc\" : \"willBeForwardReferenced\"," + " \"yac\" : {" + " \"@type\" : \"TestForwardReference$YetAnotherClass\"," + - " \"frc\" : [ {" + - " \"@type\" : \"Two\"," + - " \"id\" : \"anotherInstance\"" + - " }, {" + + " \"frc\" : {" + " \"@type\" : \"One\"," + " \"id\" : \"willBeForwardReferenced\"" + - " } ]," + - " \"id\" : \"anId\"\n" + - " },\n" + - " \"id\" : \"ForwardReferenceContainerClass1\"\n" + + " }," + + " \"id\" : \"anId\"" + + " }," + + " \"id\" : \"ForwardReferenceContainerClass1\"" + "}", ForwardReferenceContainerClass.class); @@ -72,7 +70,7 @@ public void setId(String id) { private static class YetAnotherClass { public YetAnotherClass() {} - public List frc; + public ForwardReferenceClass frc; public String id; }