You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@arrow.apache.org by li...@apache.org on 2022/04/07 17:28:29 UTC

[arrow] branch master updated: ARROW-15192: [Java] Allow use of Jackson 2.12 and higher

This is an automated email from the ASF dual-hosted git repository.

lidavidm pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/arrow.git


The following commit(s) were added to refs/heads/master by this push:
     new 80ef64186e ARROW-15192: [Java] Allow use of Jackson 2.12 and higher
80ef64186e is described below

commit 80ef64186ea69811cb5b45f316e0631f25e29ce9
Author: Laurent Goujon <la...@apache.org>
AuthorDate: Thu Apr 7 13:27:58 2022 -0400

    ARROW-15192: [Java] Allow use of Jackson 2.12 and higher
    
    Jackson 2.12 does not enable by default (de)serializers for Java
    Date/Time java.time.* classes and require the jsr310 module to be added
    to the object mapper. The absence of this module causes vector module to
    stop working with newer versions of Jackson.
    
    Address this by adding a ObjectMapper factory class which register the
    jsr310 module with the objectmapper used by vector classes.
    
    Closes #12028 from laurentgo/laurentgo/jackson
    
    Authored-by: Laurent Goujon <la...@apache.org>
    Signed-off-by: David Li <li...@gmail.com>
---
 java/pom.xml                                       | 16 +++-------
 java/vector/pom.xml                                |  4 +++
 .../arrow/vector/util/JsonStringArrayList.java     |  8 ++---
 .../arrow/vector/util/JsonStringHashMap.java       |  8 ++---
 ...StringHashMap.java => ObjectMapperFactory.java} | 34 +++++++++-------------
 5 files changed, 25 insertions(+), 45 deletions(-)

diff --git a/java/pom.xml b/java/pom.xml
index 288893b36f..495cdab057 100644
--- a/java/pom.xml
+++ b/java/pom.xml
@@ -538,19 +538,11 @@
         <version>${dep.netty.version}</version>
       </dependency>
       <dependency>
-        <groupId>com.fasterxml.jackson.core</groupId>
-        <artifactId>jackson-core</artifactId>
-        <version>${dep.jackson.version}</version>
-      </dependency>
-      <dependency>
-        <groupId>com.fasterxml.jackson.core</groupId>
-        <artifactId>jackson-annotations</artifactId>
-        <version>${dep.jackson.version}</version>
-      </dependency>
-      <dependency>
-        <groupId>com.fasterxml.jackson.core</groupId>
-        <artifactId>jackson-databind</artifactId>
+        <groupId>com.fasterxml.jackson</groupId>
+        <artifactId>jackson-bom</artifactId>
         <version>${dep.jackson.version}</version>
+        <type>pom</type>
+        <scope>import</scope>
       </dependency>
       <dependency>
         <groupId>com.google.code.findbugs</groupId>
diff --git a/java/vector/pom.xml b/java/vector/pom.xml
index fae991d383..136b9bc49e 100644
--- a/java/vector/pom.xml
+++ b/java/vector/pom.xml
@@ -44,6 +44,10 @@
       <groupId>com.fasterxml.jackson.core</groupId>
       <artifactId>jackson-databind</artifactId>
     </dependency>
+    <dependency>
+      <groupId>com.fasterxml.jackson.datatype</groupId>
+      <artifactId>jackson-datatype-jsr310</artifactId>
+    </dependency>
     <dependency>
       <groupId>commons-codec</groupId>
       <artifactId>commons-codec</artifactId>
diff --git a/java/vector/src/main/java/org/apache/arrow/vector/util/JsonStringArrayList.java b/java/vector/src/main/java/org/apache/arrow/vector/util/JsonStringArrayList.java
index 2ca71ec63d..cd08e32640 100644
--- a/java/vector/src/main/java/org/apache/arrow/vector/util/JsonStringArrayList.java
+++ b/java/vector/src/main/java/org/apache/arrow/vector/util/JsonStringArrayList.java
@@ -30,11 +30,7 @@ import com.fasterxml.jackson.databind.ObjectMapper;
  */
 public class JsonStringArrayList<E> extends ArrayList<E> {
 
-  private static ObjectMapper mapper;
-
-  static {
-    mapper = new ObjectMapper();
-  }
+  private static final ObjectMapper MAPPER = ObjectMapperFactory.newObjectMapper();
 
   public JsonStringArrayList() {
     super();
@@ -47,7 +43,7 @@ public class JsonStringArrayList<E> extends ArrayList<E> {
   @Override
   public final String toString() {
     try {
-      return mapper.writeValueAsString(this);
+      return MAPPER.writeValueAsString(this);
     } catch (JsonProcessingException e) {
       throw new IllegalStateException("Cannot serialize array list to JSON string", e);
     }
diff --git a/java/vector/src/main/java/org/apache/arrow/vector/util/JsonStringHashMap.java b/java/vector/src/main/java/org/apache/arrow/vector/util/JsonStringHashMap.java
index f41ae4ee27..d6972c4f22 100644
--- a/java/vector/src/main/java/org/apache/arrow/vector/util/JsonStringHashMap.java
+++ b/java/vector/src/main/java/org/apache/arrow/vector/util/JsonStringHashMap.java
@@ -31,16 +31,12 @@ import com.fasterxml.jackson.databind.ObjectMapper;
  */
 public class JsonStringHashMap<K, V> extends LinkedHashMap<K, V> {
 
-  private static ObjectMapper mapper;
-
-  static {
-    mapper = new ObjectMapper();
-  }
+  private static final ObjectMapper MAPPER = ObjectMapperFactory.newObjectMapper();
 
   @Override
   public final String toString() {
     try {
-      return mapper.writeValueAsString(this);
+      return MAPPER.writeValueAsString(this);
     } catch (JsonProcessingException e) {
       throw new IllegalStateException("Cannot serialize hash map to JSON string", e);
     }
diff --git a/java/vector/src/main/java/org/apache/arrow/vector/util/JsonStringHashMap.java b/java/vector/src/main/java/org/apache/arrow/vector/util/ObjectMapperFactory.java
similarity index 55%
copy from java/vector/src/main/java/org/apache/arrow/vector/util/JsonStringHashMap.java
copy to java/vector/src/main/java/org/apache/arrow/vector/util/ObjectMapperFactory.java
index f41ae4ee27..39488e96ef 100644
--- a/java/vector/src/main/java/org/apache/arrow/vector/util/JsonStringHashMap.java
+++ b/java/vector/src/main/java/org/apache/arrow/vector/util/ObjectMapperFactory.java
@@ -17,32 +17,24 @@
 
 package org.apache.arrow.vector.util;
 
-import java.util.LinkedHashMap;
-
-import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.json.JsonMapper;
+import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
 
 /**
- * Simple class that extends the regular java.util.HashMap but overrides the
- * toString() method of the HashMap class to produce a JSON string instead
- *
- * @param <K> The type of the key for the map.
- * @param <V> The type of the value for the map.
+ * A {@link ObjectMapper} factory to read/write JSON.
  */
-public class JsonStringHashMap<K, V> extends LinkedHashMap<K, V> {
+public final class ObjectMapperFactory {
 
-  private static ObjectMapper mapper;
+  private ObjectMapperFactory() {}
 
-  static {
-    mapper = new ObjectMapper();
-  }
-
-  @Override
-  public final String toString() {
-    try {
-      return mapper.writeValueAsString(this);
-    } catch (JsonProcessingException e) {
-      throw new IllegalStateException("Cannot serialize hash map to JSON string", e);
-    }
+  /**
+   * Creates a new {@link ObjectMapper} instance.
+   */
+  public static ObjectMapper newObjectMapper() {
+    return JsonMapper.builder()
+       .addModule(new JavaTimeModule())
+       .build();
   }
 }
+