diff --git a/src/main/java/com/fasterxml/jackson/databind/deser/BeanDeserializer.java b/src/main/java/com/fasterxml/jackson/databind/deser/BeanDeserializer.java index bf2b0bbf617..ccfb9dd0c70 100644 --- a/src/main/java/com/fasterxml/jackson/databind/deser/BeanDeserializer.java +++ b/src/main/java/com/fasterxml/jackson/databind/deser/BeanDeserializer.java @@ -1,16 +1,32 @@ package com.fasterxml.jackson.databind.deser; -import java.io.IOException; -import java.util.*; - -import com.fasterxml.jackson.core.*; +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.core.JsonToken; +import com.fasterxml.jackson.core.JsonTokenId; import com.fasterxml.jackson.core.sym.FieldNameMatcher; -import com.fasterxml.jackson.databind.*; -import com.fasterxml.jackson.databind.deser.impl.*; +import com.fasterxml.jackson.databind.BeanDescription; +import com.fasterxml.jackson.databind.DeserializationContext; +import com.fasterxml.jackson.databind.JavaType; +import com.fasterxml.jackson.databind.JsonDeserializer; +import com.fasterxml.jackson.databind.JsonMappingException; +import com.fasterxml.jackson.databind.deser.impl.BeanAsArrayDeserializer; +import com.fasterxml.jackson.databind.deser.impl.BeanPropertyMap; +import com.fasterxml.jackson.databind.deser.impl.ExternalTypeHandler; +import com.fasterxml.jackson.databind.deser.impl.ObjectIdReader; +import com.fasterxml.jackson.databind.deser.impl.PropertyBasedCreator; +import com.fasterxml.jackson.databind.deser.impl.PropertyValueBuffer; import com.fasterxml.jackson.databind.deser.impl.ReadableObjectId.Referring; +import com.fasterxml.jackson.databind.deser.impl.UnwrappedPropertyHandler; import com.fasterxml.jackson.databind.util.NameTransformer; import com.fasterxml.jackson.databind.util.TokenBuffer; +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; + /** * Deserializer class that can deserialize instances of * arbitrary bean objects, usually from JSON Object structs, @@ -947,7 +963,6 @@ protected Object deserializeUsingPropertyBasedWithUnwrapped(JsonParser p, Deseri p.setCurrentValue(bean); // if so, need to copy all remaining tokens into buffer while (t == JsonToken.FIELD_NAME) { - p.nextToken(); // to skip name tokens.copyCurrentStructure(p); t = p.nextToken(); } diff --git a/src/test/java/com/fasterxml/jackson/databind/deser/TestBasicAnnotations.java b/src/test/java/com/fasterxml/jackson/databind/deser/TestBasicAnnotations.java index 17be5cfcff6..5daa19637f0 100644 --- a/src/test/java/com/fasterxml/jackson/databind/deser/TestBasicAnnotations.java +++ b/src/test/java/com/fasterxml/jackson/databind/deser/TestBasicAnnotations.java @@ -1,14 +1,20 @@ package com.fasterxml.jackson.databind.deser; -import java.io.*; - -import com.fasterxml.jackson.annotation.*; +import com.fasterxml.jackson.annotation.JsonAutoDetect; import com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility; -import com.fasterxml.jackson.core.*; -import com.fasterxml.jackson.databind.*; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonUnwrapped; +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.BaseMapTest; +import com.fasterxml.jackson.databind.DeserializationContext; +import com.fasterxml.jackson.databind.MapperFeature; +import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.fasterxml.jackson.databind.deser.std.StdDeserializer; +import java.io.IOException; + /** * This unit test suite tests use of basic Annotations for * bean deserialization; ones that indicate (non-constructor) @@ -61,6 +67,32 @@ final static class SizeClassSetter3 @JsonDeserialize public void x(int value) { _x = value; } } + static class Issue2088Bean { + int x; + int y; + + @JsonUnwrapped + Issue2088UnwrappedBean w; + + public Issue2088Bean(@JsonProperty("x") int x, @JsonProperty("y") int y) { + this.x = x; + this.y = y; + } + + public void setW(Issue2088UnwrappedBean w) { + this.w = w; + } + } + + static class Issue2088UnwrappedBean { + int a; + int b; + + public Issue2088UnwrappedBean(@JsonProperty("a") int a, @JsonProperty("b") int b) { + this.a = a; + this.b = b; + } + } /// Classes for testing Setter discovery with inheritance static class BaseBean @@ -181,6 +213,16 @@ public void testIssue442PrivateUnwrapped() throws Exception assertEquals(5, bean.w.i); } + // [databind#2088] + public void testIssue2088UnwrappedFieldsAfterLastCreatorProp() throws Exception + { + Issue2088Bean bean = MAPPER.readValue("{\"x\":1,\"a\":2,\"y\":3,\"b\":4}", Issue2088Bean.class); + assertEquals(1, bean.x); + assertEquals(2, bean.w.a); + assertEquals(3, bean.y); + assertEquals(4, bean.w.b); + } + /* /********************************************************** /* Test methods, annotations disabled