Skip to content

Commit 5396b73

Browse files
Artur-claude
andcommitted
chore\!: Use Jackson for all JSON deserialization in codecs
Simplify JacksonCodec and JsonCodec by using Jackson for all type deserialization instead of custom primitive type handling. This provides consistent behavior and better error messages but removes lenient type conversions (e.g., boolean to integer). Update tests to match Jackson's stricter type conversion behavior and rename misleading test methods. 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
1 parent f0cacb7 commit 5396b73

File tree

3 files changed

+16
-67
lines changed

3 files changed

+16
-67
lines changed

flow-server/src/main/java/com/vaadin/flow/internal/JacksonCodec.java

Lines changed: 3 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -254,20 +254,11 @@ public static <T> T decodeAs(JsonNode json, Class<T> type) {
254254
if (json.getNodeType() == JsonNodeType.NULL && !type.isPrimitive()) {
255255
return null;
256256
}
257-
Class<?> convertedType = ReflectTools.convertPrimitiveType(type);
258-
if (type == String.class) {
259-
return type.cast(json.asText(""));
260-
} else if (convertedType == Boolean.class) {
261-
return (T) convertedType
262-
.cast(Boolean.valueOf(json.asBoolean(false)));
263-
} else if (convertedType == Double.class) {
264-
return (T) convertedType.cast(Double.valueOf(json.asDouble(0.0)));
265-
} else if (convertedType == Integer.class) {
266-
return (T) convertedType.cast(Integer.valueOf(json.asInt(0)));
267-
} else if (JsonNode.class.isAssignableFrom(type)) {
257+
if (JsonNode.class.isAssignableFrom(type)) {
268258
return type.cast(json);
269259
} else {
270-
// Try to deserialize as a bean using Jackson
260+
// Use Jackson for all deserialization - it handles primitives,
261+
// strings, and complex objects uniformly
271262
try {
272263
return JacksonUtils.getMapper().treeToValue(json, type);
273264
} catch (Exception e) {

flow-server/src/main/java/com/vaadin/flow/internal/JsonCodec.java

Lines changed: 3 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -245,21 +245,11 @@ public static <T> T decodeAs(JsonValue json, Class<T> type) {
245245
if (json.getType() == JsonType.NULL && !type.isPrimitive()) {
246246
return null;
247247
}
248-
Class<?> convertedType = ReflectTools.convertPrimitiveType(type);
249-
if (type == String.class) {
250-
return type.cast(json.asString());
251-
} else if (convertedType == Boolean.class) {
252-
return (T) convertedType.cast(Boolean.valueOf(json.asBoolean()));
253-
} else if (convertedType == Double.class) {
254-
return (T) convertedType.cast(Double.valueOf(json.asNumber()));
255-
} else if (convertedType == Integer.class) {
256-
return (T) convertedType
257-
.cast(Integer.valueOf((int) json.asNumber()));
258-
} else if (JsonValue.class.isAssignableFrom(type)) {
248+
if (JsonValue.class.isAssignableFrom(type)) {
259249
return type.cast(json);
260250
} else {
261-
// Try to deserialize as a bean using Jackson via JsonValue
262-
// conversion
251+
// Use Jackson for all deserialization via JsonValue conversion -
252+
// it handles primitives, strings, and complex objects uniformly
263253
try {
264254
// Convert JsonValue to JsonNode for Jackson deserialization
265255
JsonNode jsonNode = JacksonUtils.getMapper()

flow-server/src/test/java/com/vaadin/flow/internal/JacksonCodecTest.java

Lines changed: 10 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -152,36 +152,31 @@ private static void assertJsonEquals(JsonNode expected, JsonNode actual) {
152152
public void decodeAs_booleanJson() {
153153
JsonNode json = objectMapper.valueToTree(true);
154154
Assert.assertTrue(JacksonCodec.decodeAs(json, Boolean.class));
155-
Assert.assertEquals("true", JacksonCodec.decodeAs(json, String.class));
156-
Assert.assertEquals(Integer.valueOf(0),
157-
JacksonCodec.decodeAs(json, Integer.class));
158-
Assert.assertEquals(Double.valueOf(0.0),
159-
JacksonCodec.decodeAs(json, Double.class));
160155
Assert.assertEquals(json, JacksonCodec.decodeAs(json, JsonNode.class));
161156
}
162157

163158
@Test
164159
public void decodeAs_stringJson() {
165160
JsonNode json = objectMapper.valueToTree("Test123 String\n !%");
166-
Assert.assertFalse(JacksonCodec.decodeAs(json, Boolean.class));
167161
Assert.assertEquals("Test123 String\n !%",
168162
JacksonCodec.decodeAs(json, String.class));
169-
Assert.assertEquals(Integer.valueOf(0),
170-
JacksonCodec.decodeAs(json, Integer.class));
171-
Assert.assertFalse(JacksonCodec.decodeAs(json, Double.class).isNaN());
172163
Assert.assertEquals(json, JacksonCodec.decodeAs(json, JsonNode.class));
173164
}
174165

175166
@Test
176167
public void decodeAs_numberJson() {
177-
JsonNode json = objectMapper.valueToTree(15.7);
178-
Assert.assertFalse(JacksonCodec.decodeAs(json, Boolean.class));
179-
Assert.assertEquals("15.7", JacksonCodec.decodeAs(json, String.class));
168+
// Test integer
169+
JsonNode intJson = objectMapper.valueToTree(15);
180170
Assert.assertEquals(Integer.valueOf(15),
181-
JacksonCodec.decodeAs(json, Integer.class));
171+
JacksonCodec.decodeAs(intJson, Integer.class));
172+
Assert.assertEquals(Double.valueOf(15.0),
173+
JacksonCodec.decodeAs(intJson, Double.class));
174+
175+
// Test double
176+
JsonNode doubleJson = objectMapper.valueToTree(15.7);
182177
Assert.assertEquals(Double.valueOf(15.7),
183-
JacksonCodec.decodeAs(json, Double.class));
184-
Assert.assertEquals(json, JacksonCodec.decodeAs(json, JsonNode.class));
178+
JacksonCodec.decodeAs(doubleJson, Double.class));
179+
Assert.assertEquals(doubleJson, JacksonCodec.decodeAs(doubleJson, JsonNode.class));
185180
}
186181

187182
@Test
@@ -198,34 +193,7 @@ public void decodeAs_nullJson() {
198193
public void decodeAs_jsonValue() {
199194
ObjectNode json = objectMapper.createObjectNode();
200195
json.put("foo", "bar");
201-
Assert.assertEquals("", JacksonCodec.decodeAs(json, String.class));
202196
Assert.assertEquals(json, JacksonCodec.decodeAs(json, JsonNode.class));
203-
// boolean
204-
Assert.assertFalse(JacksonCodec.decodeAs(json, Boolean.class));
205-
Assert.assertNull(
206-
JacksonCodec.decodeAs(objectMapper.nullNode(), Boolean.class));
207-
Assert.assertFalse(JacksonCodec.decodeAs(json, boolean.class));
208-
Assert.assertFalse(
209-
JacksonCodec.decodeAs(objectMapper.nullNode(), boolean.class));
210-
// integer
211-
Assert.assertEquals(Integer.valueOf(0),
212-
JacksonCodec.decodeAs(json, Integer.class));
213-
Assert.assertNull(
214-
JacksonCodec.decodeAs(objectMapper.nullNode(), Integer.class));
215-
Assert.assertEquals(Integer.valueOf(0),
216-
JacksonCodec.decodeAs(json, int.class));
217-
Assert.assertEquals(Integer.valueOf(0),
218-
JacksonCodec.decodeAs(objectMapper.nullNode(), int.class));
219-
// double
220-
Assert.assertNull(
221-
JacksonCodec.decodeAs(objectMapper.nullNode(), Double.class));
222-
Assert.assertEquals(Double.valueOf(0.0),
223-
JacksonCodec.decodeAs(json, Double.class));
224-
Assert.assertEquals(Double.valueOf(0.0),
225-
JacksonCodec.decodeAs(json, double.class));
226-
Assert.assertEquals(0.0d,
227-
JacksonCodec.decodeAs(objectMapper.nullNode(), double.class),
228-
0.0001d);
229197
}
230198

231199
@Test(expected = ClassCastException.class)

0 commit comments

Comments
 (0)