Skip to content

Commit 85282b1

Browse files
committed
(and actual #744 fix here, doh)
1 parent 58f4c95 commit 85282b1

File tree

2 files changed

+84
-4
lines changed

2 files changed

+84
-4
lines changed

src/main/java/com/fasterxml/jackson/databind/ObjectReader.java

+4-1
Original file line numberDiff line numberDiff line change
@@ -1362,7 +1362,10 @@ protected JsonDeserializer<Object> _findRootDeserializer(DeserializationContext
13621362
throws JsonMappingException
13631363
{
13641364
if (_rootDeserializer != null) {
1365-
return _rootDeserializer;
1365+
// 02-Apr-2015, tatu: Patch for #744 (better fix in 2.5.3)
1366+
if (valueType != JSON_NODE_TYPE) {
1367+
return _rootDeserializer;
1368+
}
13661369
}
13671370

13681371
// Sanity check: must have actual type...

src/test/java/com/fasterxml/jackson/databind/convert/TestUpdateValue.java

+80-3
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
11
package com.fasterxml.jackson.databind.convert;
22

3+
import java.io.IOException;
34
import java.util.*;
45

56
import com.fasterxml.jackson.annotation.JsonView;
6-
import com.fasterxml.jackson.databind.BaseMapTest;
7-
import com.fasterxml.jackson.databind.ObjectMapper;
7+
import com.fasterxml.jackson.core.*;
8+
import com.fasterxml.jackson.databind.*;
9+
import com.fasterxml.jackson.databind.deser.std.StdDeserializer;
10+
import com.fasterxml.jackson.databind.module.SimpleModule;
811

912
import static org.junit.Assert.assertArrayEquals;
1013

@@ -44,7 +47,40 @@ public class Updateable {
4447
@JsonView(TextView.class)
4548
public String str;
4649
}
47-
50+
51+
// for [databind#744]
52+
static class DataA {
53+
public int i = 1;
54+
public int j = 2;
55+
56+
}
57+
58+
static class DataB {
59+
public DataA da = new DataA();
60+
public int k = 3;
61+
}
62+
63+
static class DataADeserializer extends StdDeserializer<DataA> {
64+
private static final long serialVersionUID = 1L;
65+
66+
DataADeserializer() {
67+
super(DataA.class);
68+
}
69+
70+
public DataA deserialize(JsonParser jp, DeserializationContext ctxt)
71+
throws JsonProcessingException, IOException {
72+
if (jp.getCurrentToken() != JsonToken.START_OBJECT) {
73+
throw ctxt.mappingException("Wrong current token, expected START_OBJECT, got: "
74+
+jp.getCurrentToken());
75+
}
76+
/*JsonNode node =*/ jp.readValueAsTree();
77+
78+
DataA da = new DataA();
79+
da.i = 5;
80+
return da;
81+
}
82+
}
83+
4884
/*
4985
/********************************************************
5086
/* Unit tests
@@ -146,4 +182,45 @@ public void testUpdatingWithViews() throws Exception
146182
assertEquals(100, bean.num);
147183
assertEquals("foobar", bean.str);
148184
}
185+
186+
// [databind#744]
187+
public void testIssue744() throws IOException
188+
{
189+
ObjectMapper mapper = new ObjectMapper();
190+
SimpleModule module = new SimpleModule();
191+
module.addDeserializer(DataA.class, new DataADeserializer());
192+
mapper.registerModule(module);
193+
194+
DataB db = new DataB();
195+
db.da.i = 11;
196+
db.k = 13;
197+
String jsonBString = mapper.writeValueAsString(db);
198+
JsonNode jsonBNode = mapper.valueToTree(db);
199+
200+
// create parent
201+
DataB dbNewViaString = mapper.readValue(jsonBString, DataB.class);
202+
assertEquals(5, dbNewViaString.da.i);
203+
assertEquals(13, dbNewViaString.k);
204+
205+
DataB dbNewViaNode = mapper.treeToValue(jsonBNode, DataB.class);
206+
assertEquals(5, dbNewViaNode.da.i);
207+
assertEquals(13, dbNewViaNode.k);
208+
209+
// update parent
210+
DataB dbUpdViaString = new DataB();
211+
DataB dbUpdViaNode = new DataB();
212+
213+
assertEquals(1, dbUpdViaString.da.i);
214+
assertEquals(3, dbUpdViaString.k);
215+
mapper.readerForUpdating(dbUpdViaString).readValue(jsonBString);
216+
assertEquals(5, dbUpdViaString.da.i);
217+
assertEquals(13, dbUpdViaString.k);
218+
219+
assertEquals(1, dbUpdViaNode.da.i);
220+
assertEquals(3, dbUpdViaNode.k);
221+
222+
mapper.readerForUpdating(dbUpdViaNode).readValue(jsonBNode);
223+
assertEquals(5, dbUpdViaNode.da.i);
224+
assertEquals(13, dbUpdViaNode.k);
225+
}
149226
}

0 commit comments

Comments
 (0)