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 203b7ae JOHNZON-251 ensure adapters are used in arrays 203b7ae is described below commit 203b7aed30bd8874ac965e6eab631054ac6310f1 Author: Romain Manni-Bucau <rmannibu...@apache.org> AuthorDate: Wed Aug 14 10:31:06 2019 +0200 JOHNZON-251 ensure adapters are used in arrays --- .../java/org/apache/johnzon/jsonb/DefaultMappingTest.java | 2 +- .../java/org/apache/johnzon/mapper/MappingParserImpl.java | 11 +++++++++-- .../org/apache/johnzon/mapper/access/MethodAccessMode.java | 14 ++++++++++++-- 3 files changed, 22 insertions(+), 5 deletions(-) diff --git a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/DefaultMappingTest.java b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/DefaultMappingTest.java index 33c9fd6..af6930c 100644 --- a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/DefaultMappingTest.java +++ b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/DefaultMappingTest.java @@ -669,7 +669,7 @@ public class DefaultMappingTest { POJOWithMixedFieldAccess pojoWithMixedFieldAccess = new POJOWithMixedFieldAccess(); - assertEquals("{\"active\":true,\"id\":2,\"name\":\"pojoName\"}"/*,\"valid\":false}"*/, JSONB.toJson(pojoWithMixedFieldAccess)); + assertEquals("{\"active\":true,\"id\":2,\"name\":\"pojoName\",\"valid\":false}", JSONB.toJson(pojoWithMixedFieldAccess)); //composite class CompositePOJO compositePOJO = new CompositePOJO(); diff --git a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MappingParserImpl.java b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MappingParserImpl.java index c259756..d6bf2cd 100644 --- a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MappingParserImpl.java +++ b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MappingParserImpl.java @@ -437,7 +437,8 @@ public class MappingParserImpl implements MappingParser { } } - private Object convertTo(final Adapter converter, final JsonValue jsonValue, JsonPointerTracker jsonPointer) { + private Object convertTo(final Adapter converter, final JsonValue jsonValue, final JsonPointerTracker jsonPointer, + final Type targetType) { final JsonValue.ValueType valueType = jsonValue != null ? jsonValue.getValueType() : null; final AdapterKey key = getAdapterKey(converter); @@ -504,6 +505,12 @@ public class MappingParserImpl implements MappingParser { if (JsonArray.class == key.getTo() || JsonStructure.class == key.getTo()) { return converter.to(jsonValue.asJsonObject()); } + if (TypeAwareAdapter.class.isInstance(converter)) { + final TypeAwareAdapter adapter = TypeAwareAdapter.class.cast(converter); + if (adapter.getFrom().equals(targetType)) { + return converter.to(readObject(jsonValue, adapter.getTo())); + } + } return buildArray(key.getTo(), jsonValue.asJsonArray(), null, null, jsonPointer, null); } return converter.to(jsonValue.toString()); @@ -969,7 +976,7 @@ public class MappingParserImpl implements MappingParser { try { return converter == null ? toObject(baseInstance, jsonValue, type, itemConverter, jsonPointer, rootType) : - convertTo(converter, jsonValue, jsonPointer); + convertTo(converter, jsonValue, jsonPointer, type); } catch (Exception e) { if (e instanceof MapperException) { throw e; diff --git a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/access/MethodAccessMode.java b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/access/MethodAccessMode.java index e35c425..c43ef3b 100644 --- a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/access/MethodAccessMode.java +++ b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/access/MethodAccessMode.java @@ -48,11 +48,21 @@ public class MethodAccessMode extends BaseAccessMode { final PropertyDescriptor[] propertyDescriptors = getPropertyDescriptors(clazz); for (final PropertyDescriptor descriptor : propertyDescriptors) { final Method readMethod = descriptor.getReadMethod(); + final String name = descriptor.getName(); if (readMethod != null && readMethod.getDeclaringClass() != Object.class) { - if (isIgnored(descriptor.getName()) || Meta.getAnnotation(readMethod, JohnzonAny.class) != null) { + if (isIgnored(name) || Meta.getAnnotation(readMethod, JohnzonAny.class) != null) { continue; } - readers.put(extractKey(descriptor.getName(), readMethod, null), new MethodReader(readMethod, readMethod.getGenericReturnType())); + readers.put(extractKey(name, readMethod, null), new MethodReader(readMethod, readMethod.getGenericReturnType())); + } else if (readMethod == null && descriptor.getWriteMethod() != null && // isXXX, not supported by javabeans + (descriptor.getPropertyType() == Boolean.class || descriptor.getPropertyType() == boolean.class)) { + try { + final Method method = clazz.getMethod( + "is" + Character.toUpperCase(name.charAt(0)) + (name.length() > 1 ? name.substring(1) : "")); + readers.put(extractKey(name, method, null), new MethodReader(method, method.getGenericReturnType())); + } catch (final NoSuchMethodException e) { + // no-op + } } } return readers;