Repository: johnzon Updated Branches: refs/heads/master 092848f20 -> 4345b0a76
JOHNZON-144 use @JohnzonConverter in Jsonb too Project: http://git-wip-us.apache.org/repos/asf/johnzon/repo Commit: http://git-wip-us.apache.org/repos/asf/johnzon/commit/4345b0a7 Tree: http://git-wip-us.apache.org/repos/asf/johnzon/tree/4345b0a7 Diff: http://git-wip-us.apache.org/repos/asf/johnzon/diff/4345b0a7 Branch: refs/heads/master Commit: 4345b0a7632ea2e7d7ec6b9a77820de29ebe7258 Parents: 092848f Author: Reinhard Sandtner <[email protected]> Authored: Mon Nov 6 20:37:17 2017 +0100 Committer: Reinhard Sandtner <[email protected]> Committed: Mon Nov 6 20:37:17 2017 +0100 ---------------------------------------------------------------------- .../apache/johnzon/jsonb/JsonbAccessMode.java | 20 +++++-- .../jsonb/JohnzonConverterInJsonbTest.java | 55 ++++++++++++++++++++ 2 files changed, 71 insertions(+), 4 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/johnzon/blob/4345b0a7/johnzon-jsonb/src/main/java/org/apache/johnzon/jsonb/JsonbAccessMode.java ---------------------------------------------------------------------- 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 5852177..4526c72 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 @@ -29,8 +29,10 @@ import org.apache.johnzon.jsonb.serializer.JohnzonDeserializationContext; import org.apache.johnzon.jsonb.serializer.JohnzonSerializationContext; import org.apache.johnzon.jsonb.spi.JohnzonAdapterFactory; import org.apache.johnzon.mapper.Adapter; +import org.apache.johnzon.mapper.Converter; import org.apache.johnzon.mapper.JohnzonAny; import org.apache.johnzon.mapper.JohnzonConverter; +import org.apache.johnzon.mapper.MapperConverter; import org.apache.johnzon.mapper.ObjectConverter; import org.apache.johnzon.mapper.TypeAwareAdapter; import org.apache.johnzon.mapper.access.AccessMode; @@ -711,7 +713,7 @@ public class JsonbAccessMode implements AccessMode, Closeable { validateAnnotations(annotationHolder, adapter, dateFormat, numberFormat, johnzonConverter); try { - converter = adapter == null && dateFormat == null && numberFormat == null ? + converter = adapter == null && dateFormat == null && numberFormat == null && johnzonConverter == null ? defaultConverters.get(new AdapterKey(annotationHolder.getType(), String.class)) : toConverter(annotationHolder.getType(), adapter, dateFormat, numberFormat); } catch (final InstantiationException | IllegalAccessException e) { @@ -730,7 +732,12 @@ public class JsonbAccessMode implements AccessMode, Closeable { instance.getValue().deserialize(parserFactory.get().createParser(jsonObject), new JohnzonDeserializationContext(parser), targetType); } else if (johnzonConverter != null) { try { - reader = (ObjectConverter.Reader) johnzonConverter.value().newInstance(); + MapperConverter mapperConverter = johnzonConverter.value().newInstance(); + if (mapperConverter instanceof Converter) { + converter = new ConverterAdapter<>((Converter) mapperConverter); + } else if (mapperConverter instanceof ObjectConverter.Reader) { + reader = (ObjectConverter.Reader) mapperConverter; + } } catch (final InstantiationException | IllegalAccessException e) { throw new IllegalArgumentException(e); } @@ -751,7 +758,7 @@ public class JsonbAccessMode implements AccessMode, Closeable { validateAnnotations(initialReader, adapter, dateFormat, numberFormat, johnzonConverter); try { - converter = adapter == null && dateFormat == null && numberFormat == null ? + converter = adapter == null && dateFormat == null && numberFormat == null && johnzonConverter == null ? defaultConverters.get(new AdapterKey(initialReader.getType(), String.class)) : toConverter(initialReader.getType(), adapter, dateFormat, numberFormat); } catch (final InstantiationException | IllegalAccessException e) { @@ -770,7 +777,12 @@ public class JsonbAccessMode implements AccessMode, Closeable { instance.getValue().serialize(instance1, jsonbGenerator.getJsonGenerator(), new JohnzonSerializationContext(jsonbGenerator)); } else if (johnzonConverter != null) { try { - writer = (ObjectConverter.Writer) johnzonConverter.value().newInstance(); + MapperConverter mapperConverter = johnzonConverter.value().newInstance(); + if (mapperConverter instanceof Converter) { + converter = new ConverterAdapter<>((Converter) mapperConverter) ; + } else if (mapperConverter instanceof ObjectConverter.Writer) { + writer = (ObjectConverter.Writer) mapperConverter; + } } catch (final InstantiationException | IllegalAccessException e) { throw new IllegalArgumentException(e); } http://git-wip-us.apache.org/repos/asf/johnzon/blob/4345b0a7/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/JohnzonConverterInJsonbTest.java ---------------------------------------------------------------------- diff --git a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/JohnzonConverterInJsonbTest.java b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/JohnzonConverterInJsonbTest.java index 75023d3..f9de06a 100644 --- a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/JohnzonConverterInJsonbTest.java +++ b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/JohnzonConverterInJsonbTest.java @@ -16,17 +16,25 @@ */ package org.apache.johnzon.jsonb; +import java.lang.reflect.Type; import java.time.Instant; import java.time.LocalDateTime; import java.time.ZoneId; +import java.time.ZonedDateTime; import java.time.format.DateTimeFormatter; +import javax.json.JsonObject; import javax.json.bind.Jsonb; import javax.json.bind.spi.JsonbProvider; import org.apache.johnzon.mapper.Converter; import org.apache.johnzon.mapper.JohnzonConverter; +import org.apache.johnzon.mapper.MappingGenerator; +import org.apache.johnzon.mapper.MappingParser; +import org.apache.johnzon.mapper.ObjectConverter; import org.junit.Test; + +import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; /** @@ -42,6 +50,53 @@ public class JohnzonConverterInJsonbTest { Jsonb jsonb = JsonbProvider.provider().create().build(); String json = jsonb.toJson(dto); assertNotNull(json); + + TestDTO deserialized = jsonb.fromJson(json, TestDTO.class); + assertEquals(dto.instant, deserialized.instant); + } + + @Test + public void testObjectConverter() { + TestDTOWithOC dto = new TestDTOWithOC(); + dto.dto = new TestDTO(); + dto.dto.instant = Instant.now(); + + Jsonb jsonb = JsonbProvider.provider().create().build(); + String json = jsonb.toJson(dto); + assertNotNull(json); + + TestDTOWithOC deserialized = jsonb.fromJson(json, TestDTOWithOC.class); + assertEquals(deserialized.dto.instant, dto.dto.instant); + } + + public static class TestDTOWithOC { + @JohnzonConverter(TestDTOConverter.class) + private TestDTO dto; + + public TestDTO getDto() { + return dto; + } + + public void setDto(TestDTO dto) { + this.dto = dto; + } + } + + public static class TestDTOConverter implements ObjectConverter.Codec<TestDTO> { + + private static final String TIMESTAMP_JSON_KEY = "timestamp"; + + @Override + public void writeJson(TestDTO instance, MappingGenerator jsonbGenerator) { + jsonbGenerator.getJsonGenerator().write(TIMESTAMP_JSON_KEY, instance.instant.atZone(ZoneId.of("UTC")).toString()); + } + + @Override + public TestDTO fromJson(JsonObject jsonObject, Type targetType, MappingParser parser) { + TestDTO dto = new TestDTO(); + dto.instant = ZonedDateTime.parse(jsonObject.getString(TIMESTAMP_JSON_KEY)).toInstant(); + return dto; + } } public static class TestDTO {
