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

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


The following commit(s) were added to refs/heads/master by this push:
     new 97c047d  [JOHNZON-355]: Find class level Adapter even when used in 
collection. (#76)
97c047d is described below

commit 97c047d6c0d2cd1f76925310f1ecc7a4fae22dd3
Author: Arne Limburg <a...@apache.org>
AuthorDate: Wed Nov 24 08:41:44 2021 +0100

    [JOHNZON-355]: Find class level Adapter even when used in collection. (#76)
---
 .../org/apache/johnzon/jsonb/JsonbAccessMode.java  | 18 +++++++---
 .../java/org/apache/johnzon/jsonb/AdapterTest.java | 40 ++++++++++++++++++++++
 2 files changed, 53 insertions(+), 5 deletions(-)

diff --git 
a/johnzon-jsonb/src/main/java/org/apache/johnzon/jsonb/JsonbAccessMode.java 
b/johnzon-jsonb/src/main/java/org/apache/johnzon/jsonb/JsonbAccessMode.java
index 3204101..4bf1911 100644
--- a/johnzon-jsonb/src/main/java/org/apache/johnzon/jsonb/JsonbAccessMode.java
+++ b/johnzon-jsonb/src/main/java/org/apache/johnzon/jsonb/JsonbAccessMode.java
@@ -977,7 +977,7 @@ public class JsonbAccessMode implements AccessMode, 
Closeable {
             final boolean hasRawType = hasRawType(annotationHolder.getType());
             final JsonbTypeDeserializer deserializer = 
annotationHolder.getAnnotation(JsonbTypeDeserializer.class);
             final JsonbTypeAdapter adapter = 
annotationHolder.getAnnotation(JsonbTypeAdapter.class);
-            final JsonbTypeAdapter typeAdapter = hasRawType ? 
getRawType(annotationHolder.getType()).getDeclaredAnnotation(JsonbTypeAdapter.class)
 : null;
+            final JsonbTypeAdapter typeAdapter = hasRawType ? 
getRawTargetType(annotationHolder.getType()).getDeclaredAnnotation(JsonbTypeAdapter.class)
 : null;
             JsonbDateFormat dateFormat = dateType ? 
annotationHolder.getAnnotation(JsonbDateFormat.class) : null;
             JsonbNumberFormat numberFormat = numberType ? 
annotationHolder.getAnnotation(JsonbNumberFormat.class) : null;
             final JohnzonConverter johnzonConverter = 
annotationHolder.getAnnotation(JohnzonConverter.class);
@@ -1077,7 +1077,7 @@ public class JsonbAccessMode implements AccessMode, 
Closeable {
             final boolean hasRawType = hasRawType(reader.getType());
             final JsonbTypeSerializer serializer = 
reader.getAnnotation(JsonbTypeSerializer.class);
             final JsonbTypeAdapter adapter = 
reader.getAnnotation(JsonbTypeAdapter.class);
-            final JsonbTypeAdapter typeAdapter = hasRawType ? 
getRawType(reader.getType()).getDeclaredAnnotation(JsonbTypeAdapter.class) : 
null;
+            final JsonbTypeAdapter typeAdapter = hasRawType ? 
getRawTargetType(reader.getType()).getDeclaredAnnotation(JsonbTypeAdapter.class)
 : null;
             JsonbDateFormat dateFormat = dateType ? 
reader.getAnnotation(JsonbDateFormat.class) : null;
             JsonbNumberFormat numberFormat = numberType ? 
reader.getAnnotation(JsonbNumberFormat.class) : null;
             final JohnzonConverter johnzonConverter = 
reader.getAnnotation(JohnzonConverter.class);
@@ -1149,12 +1149,20 @@ public class JsonbAccessMode implements AccessMode, 
Closeable {
                         
Class.class.isInstance(ParameterizedType.class.cast(type).getRawType()));
     }
 
-    private Class<?> getRawType(final Type type) { // only intended to be used 
after hasRawType check
+    private Class<?> getRawTargetType(final Type type) { // only intended to 
be used after hasRawType check
         if (Class.class.isInstance(type)) {
             return Class.class.cast(type);
         }
-        // ParameterizedType + Class raw type
-        return 
Class.class.cast(ParameterizedType.class.cast(type).getRawType());
+        ParameterizedType parameterizedType = 
ParameterizedType.class.cast(type);
+        Class<?> rawType = Class.class.cast(parameterizedType.getRawType());
+        if (Collection.class.isAssignableFrom(rawType) || 
Map.class.isAssignableFrom(rawType)) {
+            Type[] actualTypeArguments = 
parameterizedType.getActualTypeArguments();
+            Type itemType = actualTypeArguments[actualTypeArguments.length - 
1];
+            if (Class.class.isInstance(itemType)) {
+                return Class.class.cast(itemType);
+            }
+        }
+        return rawType;
     }
 
     private static class ClassDecoratedType implements DecoratedType {
diff --git 
a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/AdapterTest.java 
b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/AdapterTest.java
index 862c10e..840273f 100644
--- a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/AdapterTest.java
+++ b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/AdapterTest.java
@@ -167,6 +167,46 @@ public class AdapterTest {
         assertEquals(22, Bar2.class.cast(read.bars.get(1)).value2);
     }
 
+    @Test
+    public void adaptCollectionValue() {
+        final Jsonb jsonb = JsonbBuilder.create();
+
+        Bar bar = new Bar();
+        bar.value = 42;
+        BarCollection barCollection = new BarCollection();
+        barCollection.collection = new ArrayList<Bar>();
+        barCollection.collection.add(bar);
+
+        String barCollectionJson = jsonb.toJson(barCollection);
+        assertTrue(barCollectionJson.contains("42"));
+
+        BarCollection adaptedBarCollection = jsonb.fromJson(barCollectionJson, 
BarCollection.class);
+        assertEquals(1, adaptedBarCollection.collection.size());
+        assertEquals(42, adaptedBarCollection.collection.get(0).value);
+
+        Baz baz = new Baz();
+        baz.value = "42";
+        BazCollection bazCollection = new BazCollection();
+        bazCollection.collection = new ArrayList<Baz>();
+        bazCollection.collection.add(baz);
+
+        String bazCollectionJson = jsonb.toJson(bazCollection);
+        assertTrue(bazCollectionJson.contains("42"));
+
+        BazCollection adaptedBazCollection = jsonb.fromJson(bazCollectionJson, 
BazCollection.class);
+        assertEquals(1, adaptedBazCollection.collection.size());
+        assertEquals("42", adaptedBazCollection.collection.get(0).value);
+    }
+
+    public static class BarCollection {
+        @JsonbTypeAdapter(BarAdapter.class)
+        public List<Bar> collection;
+    }
+
+    public static class BazCollection {
+        public List<Baz> collection;
+    }
+
     public static class Polymorphism {
         @JsonbTypeAdapter(PolyBarAdapter.class)
         public List<Bar> bars;

Reply via email to