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 <[email protected]>
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;