From 644487bf9b525b26734bfda1780b272b52631c5e Mon Sep 17 00:00:00 2001 From: Tatu Saloranta Date: Sat, 4 Jun 2016 20:27:07 -0700 Subject: [PATCH] Fix #1255 --- .../databind/ser/impl/WritableObjectId.java | 14 ++++++-- .../objectid/AlwaysAsReferenceFirstTest.java | 35 +++++++++++++++++++ 2 files changed, 47 insertions(+), 2 deletions(-) create mode 100644 src/test/java/com/fasterxml/jackson/databind/objectid/AlwaysAsReferenceFirstTest.java diff --git a/src/main/java/com/fasterxml/jackson/databind/ser/impl/WritableObjectId.java b/src/main/java/com/fasterxml/jackson/databind/ser/impl/WritableObjectId.java index f16a6e7fb3..d84269445e 100644 --- a/src/main/java/com/fasterxml/jackson/databind/ser/impl/WritableObjectId.java +++ b/src/main/java/com/fasterxml/jackson/databind/ser/impl/WritableObjectId.java @@ -19,6 +19,10 @@ public final class WritableObjectId public Object id; + /** + * Marker to denote whether Object Id value has been written as part of an Object, + * to be referencible. Remains false when forward-reference is written. + */ protected boolean idWritten = false; public WritableObjectId(ObjectIdGenerator generator) { @@ -27,7 +31,7 @@ public WritableObjectId(ObjectIdGenerator generator) { public boolean writeAsId(JsonGenerator gen, SerializerProvider provider, ObjectIdWriter w) throws IOException { - if (id != null && (idWritten || w.alwaysAsId)) { + if ((id != null) && (idWritten || w.alwaysAsId)) { // 03-Aug-2013, tatu: Prefer Native Object Ids if available if (gen.canWriteObjectId()) { gen.writeObjectRef(String.valueOf(id)); @@ -40,7 +44,13 @@ public boolean writeAsId(JsonGenerator gen, SerializerProvider provider, ObjectI } public Object generateId(Object forPojo) { - return (id = generator.generateId(forPojo)); + // 04-Jun-2016, tatu: As per [databind#1255], need to consider possibility of + // id being generated for "alwaysAsId", but not being written as POJO; regardless, + // need to use existing id if there is one: + if (id == null) { + id = generator.generateId(forPojo); + } + return id; } /** diff --git a/src/test/java/com/fasterxml/jackson/databind/objectid/AlwaysAsReferenceFirstTest.java b/src/test/java/com/fasterxml/jackson/databind/objectid/AlwaysAsReferenceFirstTest.java new file mode 100644 index 0000000000..9749c0caca --- /dev/null +++ b/src/test/java/com/fasterxml/jackson/databind/objectid/AlwaysAsReferenceFirstTest.java @@ -0,0 +1,35 @@ +package com.fasterxml.jackson.databind.objectid; + +import com.fasterxml.jackson.annotation.*; +import com.fasterxml.jackson.databind.*; + +public class AlwaysAsReferenceFirstTest extends BaseMapTest +{ + @JsonPropertyOrder({ "bar1", "bar2" }) + static class Foo { + + @JsonIdentityReference(alwaysAsId = true) + public Bar bar1; + + @JsonIdentityReference + public Bar bar2; + } + + @JsonIdentityInfo(generator = ObjectIdGenerators.IntSequenceGenerator.class) + static class Bar { + public int value = 3; + } + + public void testIssue1255() throws Exception + { + ObjectMapper mapper = new ObjectMapper(); + Foo mo = new Foo(); + mo.bar1 = new Bar(); + mo.bar2 = mo.bar1; + + String json = mapper.writeValueAsString(mo); + + Foo result = mapper.readValue(json, Foo.class); + assertNotNull(result); + } +}