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;