Skip to content

Commit 2f9e5d3

Browse files
committed
Update jackson to 2.16, adapt to behavioral changes
(1) Jackson adapted handling for Optional serialization providing a custom exception message if Optional is being serialized. Scout does not support serialization of Java Optional, therefore adapt test case. See also: FasterXML/jackson-databind#4082 FasterXML/jackson-databind@d7e77c3 (2) Jackson adapted handling for untyped deserialization of floating point numbers. Former implementations (before 2.15) deserialized floating point numbers within lists as BigDecimal. Since issue 903 and 3751 numbers are deserialized into the smalles possible Java data type (same behavior as plain numbers not within a JSON list element). Therefore Scout DoCollectionDeserializer was adapted identically to DoEntityDeserializer to enforce using BigDecimal for unknown (raw) number deserialization. See also: FasterXML/jackson-core#903 FasterXML/jackson-core@4c957e3 and FasterXML/jackson-databind#3751 FasterXML/jackson-databind@23ea48c 354734, 371286
1 parent 10ba361 commit 2f9e5d3

File tree

3 files changed

+43
-15
lines changed

3 files changed

+43
-15
lines changed

org.eclipse.scout.rt.jackson.test/src/test/java/org/eclipse/scout/rt/jackson/dataobject/JsonDataObjectsSerializationTest.java

Lines changed: 31 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -167,7 +167,6 @@
167167
import com.fasterxml.jackson.databind.exc.InvalidDefinitionException;
168168
import com.fasterxml.jackson.databind.exc.InvalidFormatException;
169169
import com.fasterxml.jackson.databind.exc.InvalidTypeIdException;
170-
import com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException;
171170

172171
/**
173172
* Various test cases serializing and deserializing Scout data objects from/to JSON
@@ -1803,6 +1802,24 @@ public void testSerializeDeserialize_EntityWithCollectionRaw() throws Exception
18031802
assertEquals("TestItem2", attribute7.get(1).get(ScoutDataObjectModule.DEFAULT_TYPE_ATTRIBUTE_NAME));
18041803
}
18051804

1805+
@Test
1806+
public void testSerializeDeserialize_RawEntityWithDouble() throws Exception {
1807+
DoEntity entity = BEANS.get(DoEntity.class);
1808+
entity.put("attribute", 45.69);
1809+
String json = s_dataObjectMapper.writeValueAsString(entity);
1810+
DoEntity doMarshalled = s_dataObjectMapper.readValue(json, DoEntity.class);
1811+
assertEquals(new BigDecimal("45.69"), doMarshalled.get("attribute"));
1812+
}
1813+
1814+
@Test
1815+
public void testSerializeDeserialize_RawEntityWithDoubleList() throws Exception {
1816+
DoEntity entity = BEANS.get(DoEntity.class);
1817+
entity.put("attribute", List.of(45.69));
1818+
String json = s_dataObjectMapper.writeValueAsString(entity);
1819+
DoEntity doMarshalled = s_dataObjectMapper.readValue(json, DoEntity.class);
1820+
assertEquals(new BigDecimal("45.69"), doMarshalled.getList("attribute").get(0));
1821+
}
1822+
18061823
@Test
18071824
public void testSerializeDeserialize_TestMapDo() throws Exception {
18081825
TestMapDo mapDo = new TestMapDo();
@@ -3225,27 +3242,28 @@ public void testSerializeDeserializeThrowable() throws Exception {
32253242
assertArrayEquals(exception.getStackTrace(), marshalled.getException().getStackTrace());
32263243
}
32273244

3245+
/**
3246+
* {@link Optional} is currently not serializable/deserializable using Scout Jackson implementation.
3247+
*/
32283248
@Test
32293249
public void testSerializeDeserializeOptionalDo() throws Exception {
32303250
@SuppressWarnings("unchecked")
32313251
TestOptionalDo optional = BEANS.get(TestOptionalDo.class)
32323252
.withOptString(Optional.empty())
32333253
.withOptStringList(Optional.empty(), Optional.of("foo"));
3234-
String json = s_dataObjectMapper.writeValueAsString(optional);
32353254

3236-
// currently serializable using Scout Jackson implementation, but without values, e.g. useless!
3237-
assertJsonEquals("TestOptionalDo.json", json);
3255+
// Expect:
3256+
// com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Java 8 optional type `java.util.Optional<java.lang.String>`
3257+
// not supported by default: add Module "com.fasterxml.jackson.datatype:jackson-datatype-jdk8" to enable handling
3258+
JsonMappingException writeException = assertThrows(JsonMappingException.class, () -> s_dataObjectMapper.writeValueAsString(optional));
3259+
assertTrue("expected InvalidDefinitionException, got " + writeException, writeException instanceof InvalidDefinitionException);
32383260

3239-
// currently not deserializable using Scout Jackson implementation
3261+
// Expect:
3262+
// com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Java 8 optional type `java.util.Optional<java.lang.String>`
3263+
// not supported by default: add Module "com.fasterxml.jackson.datatype:jackson-datatype-jdk8" to enable handling
3264+
String json = readResourceAsString("TestOptionalDo.json");
32403265
JsonMappingException exception = assertThrows(JsonMappingException.class, () -> s_dataObjectMapper.readValue(json, TestOptionalDo.class));
3241-
3242-
// TODO [23.1] pbz remove when JDK 11 is no longer supported
3243-
if ("11".equals(System.getProperty("java.specification.version"))) {
3244-
assertTrue("expected cause UnrecognizedPropertyException, got " + exception.getCause(), exception.getCause() instanceof UnrecognizedPropertyException);
3245-
}
3246-
else {
3247-
assertTrue("expected cause InvalidDefinitionException, got " + exception.getCause(), exception.getCause() instanceof InvalidDefinitionException);
3248-
}
3266+
assertTrue("expected InvalidDefinitionException, got " + exception.getCause(), exception.getCause() instanceof InvalidDefinitionException);
32493267
}
32503268

32513269
@Test

org.eclipse.scout.rt.jackson/src/main/java/org/eclipse/scout/rt/jackson/dataobject/DoCollectionDeserializer.java

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
package org.eclipse.scout.rt.jackson.dataobject;
1111

1212
import java.io.IOException;
13+
import java.math.BigDecimal;
1314
import java.util.Collection;
1415
import java.util.function.Supplier;
1516

@@ -74,10 +75,19 @@ protected ResolvedType resolveListElementType(JsonParser p) {
7475
}
7576
else {
7677
// all JSON scalar values are deserialized as bound type (if available) and as fallback as raw object using default jackson typing
77-
return ObjectUtility.nvl(m_collectionType.getBindings().getBoundType(0), TypeFactory.unknownType());
78+
return ObjectUtility.nvl(m_collectionType.getBindings().getBoundType(0), resolveFallbackListElementType(p));
7879
}
7980
}
8081

82+
protected ResolvedType resolveFallbackListElementType(JsonParser p) {
83+
if (p.getCurrentToken() == JsonToken.VALUE_NUMBER_FLOAT) {
84+
// deserialize floating point numbers as BigDecimal
85+
return TypeFactory.defaultInstance().constructType(BigDecimal.class);
86+
}
87+
// JSON scalar values are deserialized as raw object using default jackson typing
88+
return TypeFactory.unknownType();
89+
}
90+
8191
@Override
8292
public Object deserializeWithType(JsonParser p, DeserializationContext ctxt, TypeDeserializer typeDeserializer) throws IOException {
8393
return deserialize(p, ctxt);

org.eclipse.scout.rt/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,7 @@
123123
<jetty.version>10.0.18</jetty.version>
124124
<slf4j.version>2.0.7</slf4j.version>
125125
<logback.version>1.3.14</logback.version>
126-
<jackson.version>2.14.0</jackson.version>
126+
<jackson.version>2.16.1</jackson.version>
127127
<io.netty-version>4.1.104.Final</io.netty-version>
128128
<apache.tika-version>2.6.0</apache.tika-version>
129129
<batik.version>1.17</batik.version>

0 commit comments

Comments
 (0)