diff --git johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MappingParserImpl.java johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MappingParserImpl.java index 5928b95..ec23095 100644 --- johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MappingParserImpl.java +++ johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MappingParserImpl.java @@ -663,7 +663,7 @@ public class MappingParserImpl implements MappingParser { mapping.factory.getParameterConverter()[i], mapping.factory.getParameterItemConverter()[i], mapping.factory.getParameterTypes()[i], - null, + mapping.factory.getObjectConverter()[i], config.isDeduplicateObjects() ? new JsonPointerTracker(jsonPointer, paramName) : null); //X TODO ObjectConverter in @JOhnzonConverter with Constructors! } diff --git johnzon-mapper/src/main/java/org/apache/johnzon/mapper/access/AccessMode.java johnzon-mapper/src/main/java/org/apache/johnzon/mapper/access/AccessMode.java index 8575aa3..ba01b7c 100644 --- johnzon-mapper/src/main/java/org/apache/johnzon/mapper/access/AccessMode.java +++ johnzon-mapper/src/main/java/org/apache/johnzon/mapper/access/AccessMode.java @@ -19,6 +19,7 @@ package org.apache.johnzon.mapper.access; import org.apache.johnzon.mapper.Adapter; +import org.apache.johnzon.mapper.MapperConverter; import org.apache.johnzon.mapper.ObjectConverter; import java.lang.annotation.Annotation; @@ -52,6 +53,7 @@ public interface AccessMode { String[] getParameterNames(); Adapter[] getParameterConverter(); Adapter[] getParameterItemConverter(); + ObjectConverter.Codec[] getObjectConverter(); } Factory findFactory(Class clazz); diff --git johnzon-mapper/src/main/java/org/apache/johnzon/mapper/access/BaseAccessMode.java johnzon-mapper/src/main/java/org/apache/johnzon/mapper/access/BaseAccessMode.java index e1bba2e..36200ad 100644 --- johnzon-mapper/src/main/java/org/apache/johnzon/mapper/access/BaseAccessMode.java +++ johnzon-mapper/src/main/java/org/apache/johnzon/mapper/access/BaseAccessMode.java @@ -134,6 +134,7 @@ public abstract class BaseAccessMode implements AccessMode { final String[] constructorParameters; final Adapter[] constructorParameterConverters; final Adapter[] constructorItemParameterConverters; + final ObjectConverter.Codec[] objectConverters; if (constructorHasArguments) { factoryParameterTypes = constructor.getGenericParameterTypes(); @@ -143,6 +144,7 @@ public abstract class BaseAccessMode implements AccessMode { constructorParameterConverters = new Adapter[constructor.getGenericParameterTypes().length]; constructorItemParameterConverters = new Adapter[constructorParameterConverters.length]; + objectConverters = new ObjectConverter.Codec[constructorParameterConverters.length]; for (int i = 0; i < constructorParameters.length; i++) { for (final Annotation a : constructor.getParameterAnnotations()[i]) { if (a.annotationType() == JohnzonConverter.class) { @@ -158,7 +160,7 @@ public abstract class BaseAccessMode implements AccessMode { constructorItemParameterConverters[i] = converter; } } else { - throw new UnsupportedOperationException("TODO implement"); + objectConverters[i] = (ObjectConverter.Codec) mapperConverter; } } catch (final Exception e) { throw new IllegalArgumentException(e); @@ -171,6 +173,7 @@ public abstract class BaseAccessMode implements AccessMode { constructorParameters = null; constructorParameterConverters = null; constructorItemParameterConverters = null; + objectConverters = null; } final Constructor cons = constructor; @@ -213,6 +216,11 @@ public abstract class BaseAccessMode implements AccessMode { public Adapter[] getParameterItemConverter() { return constructorItemParameterConverters; } + + @Override + public ObjectConverter.Codec[] getObjectConverter() { + return objectConverters; + } }; } diff --git johnzon-mapper/src/test/java/org/apache/johnzon/mapper/ObjectConverterWithAnnotationTest.java johnzon-mapper/src/test/java/org/apache/johnzon/mapper/ObjectConverterWithAnnotationTest.java index 510672d..c465f8b 100644 --- johnzon-mapper/src/test/java/org/apache/johnzon/mapper/ObjectConverterWithAnnotationTest.java +++ johnzon-mapper/src/test/java/org/apache/johnzon/mapper/ObjectConverterWithAnnotationTest.java @@ -24,6 +24,7 @@ import org.junit.runner.RunWith; import org.junit.runners.Parameterized; import javax.json.JsonObject; +import java.beans.ConstructorProperties; import java.lang.reflect.Type; import java.util.Arrays; import java.util.List; @@ -159,6 +160,38 @@ public class ObjectConverterWithAnnotationTest { Assert.assertEquals(expected, tourDeFlanderen); } + @Test + public void testDeserializeObjectWithAnnotatedConsturctorParameter() { + + String json = "{" + + "\"bike\": {" + + "\"" + MANUFACTURER_ID + "\":1," + + "\"" + TYPE_INDEX + "\":0" + + "}" + + "}"; + + Mapper mapper = new MapperBuilder().setAccessModeName(accessMode) + .setReadAttributeBeforeWrite(true) + .build(); + + BikeWrapper bikeWrapper = mapper.readObject(json, BikeWrapper.class); + Assert.assertNotNull(bikeWrapper); + Assert.assertEquals(bikeWrapper.getBike(), new Bike("Canyon", BikeType.ROAD)); + } + + public static class BikeWrapper { + private final Bike bike; + + @ConstructorProperties(value = "bike") + BikeWrapper(@JohnzonConverter(value = BikeConverter.class) Bike bike) { + this.bike = bike; + } + + Bike getBike() { + return bike; + } + } + public static class CycleRace { private boolean monument;