You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@brooklyn.apache.org by he...@apache.org on 2022/06/28 13:54:17 UTC

[brooklyn-server] 01/03: fixes for jackson 2.13 upgrade -- more custom serializers

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 <al...@cloudsoft.io>
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();