This is an automated email from the ASF dual-hosted git repository. heneveld pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/brooklyn-server.git
commit ddb083d106da8f0ac783b065191255be1c8dd7b8 Author: Alex Heneveld <[email protected]> AuthorDate: Tue Jun 28 14:20:12 2022 +0100 fixes for jackson 2.13 upgrade -- more custom serializers use our common type serialization for REST API, and also enable DateTimeModule. this fixes problem where date/time classes in JSON output would break serialization. (previously these were serialized as beans and so they worked; now they aren't serialized and so break) --- core/pom.xml | 4 ++++ .../util/core/json/BrooklynObjectsJsonMapper.java | 8 ++++++- locations/container/pom.xml | 3 +-- pom.xml | 5 +++++ .../util/json/BrooklynJacksonSerializerTest.java | 26 +++++++++++++++++----- 5 files changed, 37 insertions(+), 9 deletions(-) diff --git a/core/pom.xml b/core/pom.xml index 65cda3515a..17a98bd09f 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -163,6 +163,10 @@ <groupId>com.fasterxml.jackson.dataformat</groupId> <artifactId>jackson-dataformat-yaml</artifactId> </dependency> + <dependency> + <groupId>com.fasterxml.jackson.datatype</groupId> + <artifactId>jackson-datatype-jsr310</artifactId> + </dependency> <dependency> <groupId>com.fasterxml.jackson.jaxrs</groupId> <artifactId>jackson-jaxrs-json-provider</artifactId> diff --git a/core/src/main/java/org/apache/brooklyn/util/core/json/BrooklynObjectsJsonMapper.java b/core/src/main/java/org/apache/brooklyn/util/core/json/BrooklynObjectsJsonMapper.java index a6b12aceed..19f2368d00 100644 --- a/core/src/main/java/org/apache/brooklyn/util/core/json/BrooklynObjectsJsonMapper.java +++ b/core/src/main/java/org/apache/brooklyn/util/core/json/BrooklynObjectsJsonMapper.java @@ -15,6 +15,8 @@ */ package org.apache.brooklyn.util.core.json; +import com.fasterxml.jackson.datatype.jsr310.JSR310Module; +import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; import org.apache.brooklyn.api.mgmt.ManagementContext; import org.apache.brooklyn.api.mgmt.classloading.BrooklynClassLoadingContext; import org.apache.brooklyn.core.resolve.jackson.CommonTypesSerialization; @@ -36,6 +38,9 @@ public class BrooklynObjectsJsonMapper { mapper.setSerializerProvider(sp); mapper.setVisibility(new PossiblyStrictPreferringFieldsVisibilityChecker()); + mapper.registerModule(new JavaTimeModule()); + CommonTypesSerialization.apply(mapper, mgmt); + SimpleModule mapperModule = new SimpleModule("Brooklyn", new Version(0, 0, 0, "ignored", null, null)); new BidiSerialization.ManagementContextSerialization(mgmt).install(mapperModule); @@ -50,9 +55,10 @@ public class BrooklynObjectsJsonMapper { mapperModule.addSerializer(Duration.class, new DurationSerializer()); mapperModule.addSerializer(new MultimapSerializer()); - new CommonTypesSerialization.ByteArrayObjectStreamSerialization().apply(mapperModule); + //new CommonTypesSerialization.ByteArrayObjectStreamSerialization().apply(mapperModule); mapper.registerModule(mapperModule); + return mapper; } } diff --git a/locations/container/pom.xml b/locations/container/pom.xml index b1d9b59b5b..6bf2ada563 100644 --- a/locations/container/pom.xml +++ b/locations/container/pom.xml @@ -59,10 +59,9 @@ </exclusions> </dependency> <dependency> - <!-- needed for above, but wanted at the same version of jackson we use elsewhere in brooklyn --> + <!-- needed for above, but at version we declare in root pom --> <groupId>com.fasterxml.jackson.datatype</groupId> <artifactId>jackson-datatype-jsr310</artifactId> - <version>${fasterxml.jackson.version}</version> </dependency> <!-- diff --git a/pom.xml b/pom.xml index 418f30717f..8c8793d0dd 100644 --- a/pom.xml +++ b/pom.xml @@ -559,6 +559,11 @@ <artifactId>jackson-databind</artifactId> <version>${fasterxml.jackson.version}</version> </dependency> + <dependency> + <groupId>com.fasterxml.jackson.datatype</groupId> + <artifactId>jackson-datatype-jsr310</artifactId> + <version>${fasterxml.jackson.version}</version> + </dependency> <dependency> <groupId>com.fasterxml.jackson.jaxrs</groupId> <artifactId>jackson-jaxrs-json-provider</artifactId> diff --git a/rest/rest-resources/src/test/java/org/apache/brooklyn/rest/util/json/BrooklynJacksonSerializerTest.java b/rest/rest-resources/src/test/java/org/apache/brooklyn/rest/util/json/BrooklynJacksonSerializerTest.java index cd06895886..40d3b8f00b 100644 --- a/rest/rest-resources/src/test/java/org/apache/brooklyn/rest/util/json/BrooklynJacksonSerializerTest.java +++ b/rest/rest-resources/src/test/java/org/apache/brooklyn/rest/util/json/BrooklynJacksonSerializerTest.java @@ -310,18 +310,28 @@ public class BrooklynJacksonSerializerTest { public void testLinkedListSerialization() throws Exception { LinkedList<Object> ll = new LinkedList<Object>(); ll.add(1); ll.add("two"); - String result = checkSerializesAs(ll, null); + String result = checkSerializes(ll); log.info("LLIST json is: "+result); Assert.assertFalse(result.contains("error"), "Shouldn't have had an error, instead got: "+result); Assert.assertEquals(Strings.collapseWhitespace(result, ""), "[1,\"two\"]"); } + @Test + public void testInstantSerialization() throws Exception { + Instant x = Instant.now().minusSeconds(5); + String xs = checkSerializes(x); + log.info("Instant json is: "+xs); + Assert.assertFalse(xs.contains("error"), "Shouldn't have had an error, instead got: "+xs); + Instant x2 = checkSerializesAs(x, Instant.class); + Asserts.assertEquals(x2, x); + } + @Test public void testMultiMapSerialization() throws Exception { Multimap<String, Integer> m = MultimapBuilder.hashKeys().arrayListValues().build(); m.put("bob", 24); m.put("bob", 25); - String result = checkSerializesAs(m, null); + String result = checkSerializes(m); log.info("multimap serialized as: " + result); Assert.assertFalse(result.contains("error"), "Shouldn't have had an error, instead got: "+result); Assert.assertEquals(Strings.collapseWhitespace(result, ""), "{\"bob\":[24,25]}"); @@ -329,7 +339,7 @@ public class BrooklynJacksonSerializerTest { @Test public void testUserHostAndPortSerialization() throws Exception { - String result = checkSerializesAs(UserAndHostAndPort.fromParts("testHostUser", "1.2.3.4", 22), null); + String result = checkSerializes(UserAndHostAndPort.fromParts("testHostUser", "1.2.3.4", 22)); log.info("UserHostAndPort serialized as: " + result); Assert.assertFalse(result.contains("error"), "Shouldn't have had an error, instead got: "+result); Assert.assertEquals(Strings.collapseWhitespace(result, ""), "{\"user\":\"testHostUser\",\"hostAndPort\":{\"host\":\"1.2.3.4\",\"port\":22,\"hasBracketlessColons\":false}}"); @@ -338,7 +348,7 @@ public class BrooklynJacksonSerializerTest { @Test public void testSupplierSerialization() throws Exception { ByteArrayOutputStream x = Streams.byteArrayOfString("x"); - String result = checkSerializesAs(Strings.toStringSupplier(x), null); + String result = checkSerializes(Strings.toStringSupplier(x)); log.info("SUPPLIER json is: "+result); Assert.assertFalse(result.contains("error"), "Shouldn't have had an error, instead got: "+result); } @@ -346,7 +356,7 @@ public class BrooklynJacksonSerializerTest { @Test public void testByteArrayOutputStreamSerialization() throws Exception { ByteArrayOutputStream x = Streams.byteArrayOfString("x"); - String result = checkSerializesAs(x, null); + String result = checkSerializes(x); log.info("BAOS json is: "+result); Assert.assertFalse(result.contains("error"), "Shouldn't have had an error, instead got: "+result); ByteArrayOutputStream x2 = checkSerializesAs(x, ByteArrayOutputStream.class); @@ -355,7 +365,7 @@ public class BrooklynJacksonSerializerTest { @Test public void testWrappedStreamSerialization() throws Exception { - String result = checkSerializesAs(BrooklynTaskTags.tagForStream("TEST", Streams.byteArrayOfString("x")), null); + String result = checkSerializes(BrooklynTaskTags.tagForStream("TEST", Streams.byteArrayOfString("x"))); log.info("WRAPPED STREAM json is: "+result); Assert.assertFalse(result.contains("error"), "Shouldn't have had an error, instead got: "+result); } @@ -535,6 +545,10 @@ public class BrooklynJacksonSerializerTest { } } + protected String checkSerializes(Object x) { + return checkSerializesAs(x, null); + } + @SuppressWarnings("unchecked") protected <T> T checkSerializesAs(Object x, Class<T> type) { ManagementContext mgmt = LocalManagementContextForTests.newInstance();
