JOHNZON-184 fix TypeAwareAdapter support for other types than String
Project: http://git-wip-us.apache.org/repos/asf/johnzon/repo Commit: http://git-wip-us.apache.org/repos/asf/johnzon/commit/2845dd88 Tree: http://git-wip-us.apache.org/repos/asf/johnzon/tree/2845dd88 Diff: http://git-wip-us.apache.org/repos/asf/johnzon/diff/2845dd88 Branch: refs/heads/master Commit: 2845dd8825b7b7d4f5f594f05a2ccea202bdb652 Parents: 29af5fb Author: Mark Struberg <[email protected]> Authored: Wed Aug 29 17:33:32 2018 +0200 Committer: Mark Struberg <[email protected]> Committed: Wed Aug 29 17:33:32 2018 +0200 ---------------------------------------------------------------------- .../org/apache/johnzon/jsonb/AdapterTest.java | 43 ++++++++++++++++++++ .../johnzon/mapper/MappingParserImpl.java | 29 ++++++++----- 2 files changed, 61 insertions(+), 11 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/johnzon/blob/2845dd88/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/AdapterTest.java ---------------------------------------------------------------------- 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 775442e..d6b8a05 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 @@ -176,4 +176,47 @@ public class AdapterTest { return bar; } } + + @Test + public void testAdapterOnEnum() { + Jsonb jsonb = JsonbBuilder.newBuilder().build(); + + DoorDTO door = new DoorDTO(); + door.status = DoorStatus.OPEN; + String jsonS = jsonb.toJson(door); + assertEquals( + "The expected result must be a door with a status open as its enum ordinal", + "{\"status\":0}", + jsonS); + + DoorDTO doorDTO = jsonb.fromJson(jsonS, DoorDTO.class); + + assertEquals( + "The expected result must be a door with a status open as an enum value", + DoorStatus.OPEN, + doorDTO.status); + } + + static class DoorDTO { + @JsonbTypeAdapter(StatusAdapter.class) + public DoorStatus status; + } + + public enum DoorStatus { + OPEN, CLOSE + } + + public static class StatusAdapter implements JsonbAdapter<DoorStatus, Integer> { + + @Override + public Integer adaptToJson(DoorStatus obj) { + return obj.ordinal(); + } + + @Override + public DoorStatus adaptFromJson(Integer obj) { + return DoorStatus.values()[obj]; + } + + } } http://git-wip-us.apache.org/repos/asf/johnzon/blob/2845dd88/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MappingParserImpl.java ---------------------------------------------------------------------- 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 e2dc84d..a920324 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 @@ -442,17 +442,24 @@ public class MappingParserImpl implements MappingParser { } } if (adapterKey == null) { - final Type[] types = converter.getClass().getGenericInterfaces(); - for (final Type t : types) { - if (!ParameterizedType.class.isInstance(t)) { - continue; - } - final ParameterizedType pt = ParameterizedType.class.cast(t); - if (Adapter.class == pt.getRawType()) { - final Type[] actualTypeArguments = pt.getActualTypeArguments(); - adapterKey = new AdapterKey(actualTypeArguments[0], actualTypeArguments[1]); - reverseAdaptersRegistry.putIfAbsent(converter, adapterKey); - break; + if (converter instanceof TypeAwareAdapter) { + TypeAwareAdapter typeAwareAdapter = (TypeAwareAdapter) converter; + adapterKey = new AdapterKey(typeAwareAdapter.getFrom(), typeAwareAdapter.getTo()); + reverseAdaptersRegistry.putIfAbsent(converter, adapterKey); + + } else { + final Type[] types = converter.getClass().getGenericInterfaces(); + for (final Type t : types) { + if (!ParameterizedType.class.isInstance(t)) { + continue; + } + final ParameterizedType pt = ParameterizedType.class.cast(t); + if (Adapter.class == pt.getRawType()) { + final Type[] actualTypeArguments = pt.getActualTypeArguments(); + adapterKey = new AdapterKey(actualTypeArguments[0], actualTypeArguments[1]); + reverseAdaptersRegistry.putIfAbsent(converter, adapterKey); + break; + } } } }
