You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@johnzon.apache.org by rm...@apache.org on 2020/08/19 07:30:56 UTC

[johnzon] branch master updated: [JOHNZON-321] ensure enums mapped with jsonb can use @JsonbProperty to rename the enum name in json land

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 12c59fd  [JOHNZON-321] ensure enums mapped with jsonb can use @JsonbProperty to rename the enum name in json land
12c59fd is described below

commit 12c59fd769101c972a5ceb1b9d5a3e05b8a145df
Author: Romain Manni-Bucau <rm...@gmail.com>
AuthorDate: Wed Aug 19 09:30:48 2020 +0200

    [JOHNZON-321] ensure enums mapped with jsonb can use @JsonbProperty to rename the enum name in json land
---
 .../org/apache/johnzon/jsonb/JohnzonBuilder.java   |  7 +++
 .../johnzon/jsonb/adapter/JsonbEnumAdapter.java    | 42 ++++++++++++----
 .../apache/johnzon/jsonb/EnumConverterTest.java    | 56 ++++++++++++++++++++++
 .../java/org/apache/johnzon/mapper/Mapper.java     | 38 +++++++--------
 .../org/apache/johnzon/mapper/MapperBuilder.java   |  9 +++-
 .../org/apache/johnzon/mapper/MapperConfig.java    | 16 +++++--
 .../apache/johnzon/mapper/MappingParserImpl.java   |  3 +-
 .../java/org/apache/johnzon/mapper/Mappings.java   |  3 +-
 .../johnzon/mapper/converter/EnumConverter.java    |  4 +-
 .../apache/johnzon/mapper/MapperConfigTest.java    |  4 +-
 .../test/java/org/superbiz/ExtendMappingTest.java  |  4 +-
 11 files changed, 147 insertions(+), 39 deletions(-)

diff --git a/johnzon-jsonb/src/main/java/org/apache/johnzon/jsonb/JohnzonBuilder.java b/johnzon-jsonb/src/main/java/org/apache/johnzon/jsonb/JohnzonBuilder.java
index 5bbfa2c..ab82053 100644
--- a/johnzon-jsonb/src/main/java/org/apache/johnzon/jsonb/JohnzonBuilder.java
+++ b/johnzon-jsonb/src/main/java/org/apache/johnzon/jsonb/JohnzonBuilder.java
@@ -22,6 +22,7 @@ import org.apache.johnzon.core.AbstractJsonFactory;
 import org.apache.johnzon.core.JsonGeneratorFactoryImpl;
 import org.apache.johnzon.core.JsonParserFactoryImpl;
 import org.apache.johnzon.core.Types;
+import org.apache.johnzon.jsonb.adapter.JsonbEnumAdapter;
 import org.apache.johnzon.jsonb.api.experimental.PolymorphicConfig;
 import org.apache.johnzon.jsonb.cdi.CDIs;
 import org.apache.johnzon.jsonb.converter.JohnzonJsonbAdapter;
@@ -32,6 +33,7 @@ import org.apache.johnzon.jsonb.spi.JohnzonAdapterFactory;
 import org.apache.johnzon.mapper.Converter;
 import org.apache.johnzon.mapper.Mapper;
 import org.apache.johnzon.mapper.MapperBuilder;
+import org.apache.johnzon.mapper.MapperConfig;
 import org.apache.johnzon.mapper.ObjectConverter;
 import org.apache.johnzon.mapper.SerializeValueFilter;
 import org.apache.johnzon.mapper.access.AccessMode;
@@ -96,6 +98,7 @@ public class JohnzonBuilder implements JsonbBuilder {
 
     @Override
     public Jsonb build() {
+        builder.setEnumConverterFactory(type -> newEnumConverter(Class.class.cast(type)));
         if (jsonp != null) {
             builder.setGeneratorFactory(jsonp.createGeneratorFactory(generatorConfig()));
             builder.setReaderFactory(jsonp.createReaderFactory(readerConfig()));
@@ -335,6 +338,10 @@ public class JohnzonBuilder implements JsonbBuilder {
         return doCreateJsonb(skipCdi, ijson, builder.build());
     }
 
+    private <T extends Enum<T>> MapperConfig.CustomEnumConverter<T> newEnumConverter(final Class<T> enumType) {
+        return new JsonbEnumAdapter<>(enumType);
+    }
+
     // note: this method must stay as small as possible to enable graalvm to replace it by "false" when needed
     private Jsonb doCreateJsonb(final boolean skipCdi, final boolean ijson, final Mapper mapper) {
         if (!skipCdi && cdiIntegration != null && cdiIntegration.isCanWrite()) {
diff --git a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/converter/EnumConverter.java b/johnzon-jsonb/src/main/java/org/apache/johnzon/jsonb/adapter/JsonbEnumAdapter.java
similarity index 52%
copy from johnzon-mapper/src/main/java/org/apache/johnzon/mapper/converter/EnumConverter.java
copy to johnzon-jsonb/src/main/java/org/apache/johnzon/jsonb/adapter/JsonbEnumAdapter.java
index 4000183..4a23c0b 100644
--- a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/converter/EnumConverter.java
+++ b/johnzon-jsonb/src/main/java/org/apache/johnzon/jsonb/adapter/JsonbEnumAdapter.java
@@ -16,40 +16,53 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.johnzon.mapper.converter;
+package org.apache.johnzon.jsonb.adapter;
 
-import org.apache.johnzon.mapper.Converter;
+import org.apache.johnzon.mapper.MapperConfig;
 
+import javax.json.bind.annotation.JsonbProperty;
+import java.lang.reflect.Field;
 import java.lang.reflect.Type;
 import java.util.HashMap;
 import java.util.Map;
 
-public class EnumConverter<T extends Enum<T>> implements Converter<T>, Converter.TypeAccess {
+public class JsonbEnumAdapter<T extends Enum<T>> implements MapperConfig.CustomEnumConverter<T> {
     private final Map<String, T> values;
+    private final Map<T, String> reversed;
     private final Class<T> enumType;
 
-    public EnumConverter(final Class<T> aClass) {
+    public JsonbEnumAdapter(final Class<T> aClass) {
         this.enumType = aClass;
 
         final T[] enumConstants = aClass.isEnum() ?
                 aClass.getEnumConstants() :
                 (T[]) aClass.getSuperclass().getEnumConstants();
         values = new HashMap<>(enumConstants.length);
+        reversed = new HashMap<>(enumConstants.length);
         for (final T t : enumConstants) {
-            values.put(t.name(), t);
+            try {
+                final Field field = findField(aClass, t.name());
+                final JsonbProperty property = field.getAnnotation(JsonbProperty.class);
+                final String name = property == null || property.value().isEmpty() ? t.name() : property.value();
+                values.put(name, t);
+                reversed.put(t, name);
+            } catch (final Exception e) {
+                values.put(t.name(), t);
+                reversed.put(t, t.name());
+            }
         }
     }
 
     @Override // no need of cache here, it is already fast
     public String toString(final T instance) {
-        return instance != null ? instance.name() : null;
+        return instance != null ? reversed.get(instance) : null;
     }
 
     @Override
     public T fromString(final String text) {
-        T val = values.get(text);
+        final T val = values.get(text);
         if (val == null) {
-            throw new IllegalArgumentException("Illegal " + enumType + " enum value: " + text);
+            throw new IllegalArgumentException("Illegal " + enumType + " enum value: " + text + ", known values: " + values.keySet());
         }
         return val;
     }
@@ -63,4 +76,17 @@ public class EnumConverter<T extends Enum<T>> implements Converter<T>, Converter
     public Type type() {
         return enumType;
     }
+
+    private Field findField(final Class<T> impl, final String field) {
+        Class<?> type = impl;
+        while (type != null && type != Object.class && type != Enum.class) {
+            try {
+                return type.getDeclaredField(field);
+            } catch (final NoSuchFieldException e) {
+                // continue
+            }
+            type = type.getSuperclass();
+        }
+        throw new IllegalArgumentException("Missing field: " + field);
+    }
 }
diff --git a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/EnumConverterTest.java b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/EnumConverterTest.java
new file mode 100644
index 0000000..7e081e5
--- /dev/null
+++ b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/EnumConverterTest.java
@@ -0,0 +1,56 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.johnzon.jsonb;
+
+import org.apache.johnzon.jsonb.test.JsonbRule;
+import org.junit.Rule;
+import org.junit.Test;
+
+import javax.json.bind.annotation.JsonbProperty;
+
+import static org.junit.Assert.assertEquals;
+
+public class EnumConverterTest {
+    @Rule
+    public final JsonbRule jsonb = new JsonbRule();
+
+    @Test
+    public void fromEnumToString() {
+        assertEquals(AnEnum.B, jsonb.fromJson("{\"value\":\"-2\"}", Wrapper.class).value);
+    }
+
+    @Test
+    public void fromStringToEnum() {
+        final Wrapper wrapper = new Wrapper();
+        wrapper.value = AnEnum.A;
+        assertEquals("{\"value\":\"-1\"}", jsonb.toJson(wrapper));
+    }
+
+    public static class Wrapper {
+        public AnEnum value;
+    }
+
+    public enum AnEnum {
+        @JsonbProperty("-1")
+        A,
+
+        @JsonbProperty("-2")
+        B
+    }
+}
diff --git a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/Mapper.java b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/Mapper.java
index 391c60f..709801f 100644
--- a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/Mapper.java
+++ b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/Mapper.java
@@ -18,8 +18,22 @@
  */
 package org.apache.johnzon.mapper;
 
-import static org.apache.johnzon.mapper.internal.Streams.noClose;
+import org.apache.johnzon.mapper.internal.JsonPointerTracker;
+import org.apache.johnzon.mapper.reflection.JohnzonCollectionType;
+import org.apache.johnzon.mapper.util.ArrayUtil;
 
+import javax.json.JsonArray;
+import javax.json.JsonBuilderFactory;
+import javax.json.JsonObject;
+import javax.json.JsonReader;
+import javax.json.JsonReaderFactory;
+import javax.json.JsonString;
+import javax.json.JsonStructure;
+import javax.json.JsonValue;
+import javax.json.spi.JsonProvider;
+import javax.json.stream.JsonGenerator;
+import javax.json.stream.JsonGeneratorFactory;
+import javax.json.stream.JsonParser;
 import java.io.Closeable;
 import java.io.IOException;
 import java.io.InputStream;
@@ -39,22 +53,7 @@ import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
 
-import javax.json.JsonArray;
-import javax.json.JsonBuilderFactory;
-import javax.json.JsonObject;
-import javax.json.JsonReader;
-import javax.json.JsonReaderFactory;
-import javax.json.JsonString;
-import javax.json.JsonStructure;
-import javax.json.JsonValue;
-import javax.json.spi.JsonProvider;
-import javax.json.stream.JsonGenerator;
-import javax.json.stream.JsonGeneratorFactory;
-import javax.json.stream.JsonParser;
-
-import org.apache.johnzon.mapper.internal.JsonPointerTracker;
-import org.apache.johnzon.mapper.reflection.JohnzonCollectionType;
-import org.apache.johnzon.mapper.util.ArrayUtil;
+import static org.apache.johnzon.mapper.internal.Streams.noClose;
 
 public class Mapper implements Closeable {
 
@@ -80,7 +79,6 @@ public class Mapper implements Closeable {
         this.charset = config.getEncoding();
     }
 
-
     public <T> void writeArray(final Object object, final OutputStream stream) {
         if (object instanceof short[]) {
             writeObject(ArrayUtil.asList((short[]) object), stream);
@@ -401,7 +399,9 @@ public class Mapper implements Closeable {
     }
 
     private boolean isDedup(final Type clazz) {
-        if (clazz instanceof Class) {
+        if (clazz instanceof Class &&
+                JsonValue.class != clazz && JsonStructure.class != clazz &&
+                JsonObject.class != clazz && JsonArray.class != clazz) {
             return isDeduplicateObjects((Class) clazz);
         }
         return false;
diff --git a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MapperBuilder.java b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MapperBuilder.java
index ade0e26..171f93a 100644
--- a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MapperBuilder.java
+++ b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MapperBuilder.java
@@ -33,6 +33,7 @@ import org.apache.johnzon.mapper.converter.ByteConverter;
 import org.apache.johnzon.mapper.converter.CachedDelegateConverter;
 import org.apache.johnzon.mapper.converter.CharacterConverter;
 import org.apache.johnzon.mapper.converter.DoubleConverter;
+import org.apache.johnzon.mapper.converter.EnumConverter;
 import org.apache.johnzon.mapper.converter.FloatConverter;
 import org.apache.johnzon.mapper.converter.IntegerConverter;
 import org.apache.johnzon.mapper.converter.LongConverter;
@@ -103,6 +104,7 @@ public class MapperBuilder {
     private boolean useJsRange;
     private boolean useBigDecimalForObjectNumbers;
     private boolean supportEnumContainerDeserialization = true;
+    private Function<Class<?>, MapperConfig.CustomEnumConverter<?>> enumConverterFactory = type -> new EnumConverter(type);
 
     // @experimental polymorphic api
     private Function<String, Class<?>> typeLoader;
@@ -229,10 +231,15 @@ public class MapperBuilder {
                         interfaceImplementationMapping, useJsRange, useBigDecimalForObjectNumbers,
                         supportEnumContainerDeserialization,
                         typeLoader, discriminatorMapper, discriminator,
-                        deserializationPredicate, serializationPredicate),
+                        deserializationPredicate, serializationPredicate,
+                        enumConverterFactory),
                 closeables);
     }
 
+    public void setEnumConverterFactory(final Function<Class<?>, MapperConfig.CustomEnumConverter<?>> enumConverterFactory) {
+        this.enumConverterFactory = enumConverterFactory;
+    }
+
     public ConcurrentHashMap<AdapterKey, Adapter<?,?>> getAdapters() {
         return adapters;
     }
diff --git a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MapperConfig.java b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MapperConfig.java
index d0b17d5..6e2906b 100644
--- a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MapperConfig.java
+++ b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MapperConfig.java
@@ -19,7 +19,6 @@
 package org.apache.johnzon.mapper;
 
 import org.apache.johnzon.mapper.access.AccessMode;
-import org.apache.johnzon.mapper.converter.EnumConverter;
 import org.apache.johnzon.mapper.internal.AdapterKey;
 import org.apache.johnzon.mapper.internal.ConverterAdapter;
 import org.apache.johnzon.mapper.map.LazyConverterMap;
@@ -94,6 +93,8 @@ public /* DON'T MAKE IT HIDDEN */ class MapperConfig implements Cloneable {
     private final Collection<Type> noParserAdapterTypes = new ConcurrentHashMap<Type, Boolean>().keySet(true);
     private final Collection<Type> noGeneratorAdapterTypes = new ConcurrentHashMap<Type, Boolean>().keySet(true);
 
+    private final Function<Class<?>, CustomEnumConverter<?>> enumConverterFactory;
+
     //disable checkstyle for 10+ parameters
     //CHECKSTYLE:OFF
     public MapperConfig(final LazyConverterMap adapters,
@@ -117,7 +118,8 @@ public /* DON'T MAKE IT HIDDEN */ class MapperConfig implements Cloneable {
                         final Function<Class<?>, String> discriminatorMapper,
                         final String discriminator,
                         final Predicate<Class<?>> deserializationPredicate,
-                        final Predicate<Class<?>> serializationPredicate) {
+                        final Predicate<Class<?>> serializationPredicate,
+                        final Function<Class<?>, CustomEnumConverter<?>> enumConverterFactory) {
     //CHECKSTYLE:ON
         this.objectConverterWriters = objectConverterWriters;
         this.objectConverterReaders = objectConverterReaders;
@@ -138,6 +140,7 @@ public /* DON'T MAKE IT HIDDEN */ class MapperConfig implements Cloneable {
         this.serializationPredicate = serializationPredicate;
         this.deserializationPredicate = deserializationPredicate;
         this.discriminator = discriminator;
+        this.enumConverterFactory = enumConverterFactory;
 
         // handle Adapters
         this.adapters = adapters;
@@ -157,6 +160,10 @@ public /* DON'T MAKE IT HIDDEN */ class MapperConfig implements Cloneable {
         this.deduplicateObjects = deduplicateObjects;
     }
 
+    public Function<Class<?>, CustomEnumConverter<?>> getEnumConverterFactory() {
+        return enumConverterFactory;
+    }
+
     public Collection<Type> getNoParserAdapterTypes() {
         return noParserAdapterTypes;
     }
@@ -219,7 +226,7 @@ public /* DON'T MAKE IT HIDDEN */ class MapperConfig implements Cloneable {
         if (Class.class.isInstance(aClass)) {
             final Class<?> clazz = Class.class.cast(aClass);
             if (Enum.class.isAssignableFrom(clazz)) {
-                final Adapter<?, ?> enumConverter = new ConverterAdapter(new EnumConverter(clazz), clazz);
+                final Adapter<?, ?> enumConverter = new ConverterAdapter(enumConverterFactory.apply(clazz), clazz);
                 adapters.putIfAbsent(new AdapterKey(String.class, aClass), enumConverter);
                 return enumConverter;
             }
@@ -418,4 +425,7 @@ public /* DON'T MAKE IT HIDDEN */ class MapperConfig implements Cloneable {
     public boolean isSupportEnumContainerDeserialization() {
         return supportEnumMapDeserialization;
     }
+
+    public interface CustomEnumConverter<A> extends Converter<A>, Converter.TypeAccess {
+    }
 }
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 7acdd67..71e0848 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
@@ -20,7 +20,6 @@ package org.apache.johnzon.mapper;
 
 import org.apache.johnzon.mapper.access.AccessMode;
 import org.apache.johnzon.mapper.converter.CharacterConverter;
-import org.apache.johnzon.mapper.converter.EnumConverter;
 import org.apache.johnzon.mapper.internal.AdapterKey;
 import org.apache.johnzon.mapper.internal.ConverterAdapter;
 import org.apache.johnzon.mapper.internal.JsonPointerTracker;
@@ -1126,7 +1125,7 @@ public class MappingParserImpl implements MappingParser {
         if (Class.class.isInstance(aClass)) {
             final Class<?> clazz = Class.class.cast(aClass);
             if (Enum.class.isAssignableFrom(clazz)) {
-                final Adapter<?, ?> enumConverter = new ConverterAdapter(new EnumConverter(clazz), clazz);
+                final Adapter<?, ?> enumConverter = new ConverterAdapter(config.getEnumConverterFactory().apply(clazz), clazz);
                 config.getAdapters().putIfAbsent(new AdapterKey(String.class, aClass), enumConverter);
                 return enumConverter;
             }
diff --git a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/Mappings.java b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/Mappings.java
index 1c5b045..751440d 100644
--- a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/Mappings.java
+++ b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/Mappings.java
@@ -57,7 +57,6 @@ import org.apache.johnzon.mapper.access.AccessMode;
 import org.apache.johnzon.mapper.access.FieldAccessMode;
 import org.apache.johnzon.mapper.access.MethodAccessMode;
 import org.apache.johnzon.mapper.converter.DateWithCopyConverter;
-import org.apache.johnzon.mapper.converter.EnumConverter;
 import org.apache.johnzon.mapper.internal.AdapterKey;
 import org.apache.johnzon.mapper.internal.ConverterAdapter;
 import org.apache.johnzon.mapper.reflection.Generics;
@@ -699,7 +698,7 @@ public class Mappings {
                 final AdapterKey key = new AdapterKey(String.class, type);
                 converter = adapters.get(key); // first ensure user didnt override it
                 if (converter == null) {
-                    converter = new ConverterAdapter(new EnumConverter(type), type);
+                    converter = new ConverterAdapter(config.getEnumConverterFactory().apply(type), type);
                     adapters.put(key, (Adapter<?, ?>) converter);
                 }
             }
diff --git a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/converter/EnumConverter.java b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/converter/EnumConverter.java
index 4000183..00128b3 100644
--- a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/converter/EnumConverter.java
+++ b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/converter/EnumConverter.java
@@ -18,13 +18,13 @@
  */
 package org.apache.johnzon.mapper.converter;
 
-import org.apache.johnzon.mapper.Converter;
+import org.apache.johnzon.mapper.MapperConfig;
 
 import java.lang.reflect.Type;
 import java.util.HashMap;
 import java.util.Map;
 
-public class EnumConverter<T extends Enum<T>> implements Converter<T>, Converter.TypeAccess {
+public class EnumConverter<T extends Enum<T>> implements MapperConfig.CustomEnumConverter<T> {
     private final Map<String, T> values;
     private final Class<T> enumType;
 
diff --git a/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/MapperConfigTest.java b/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/MapperConfigTest.java
index 4044781..506e74e 100644
--- a/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/MapperConfigTest.java
+++ b/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/MapperConfigTest.java
@@ -21,6 +21,7 @@ package org.apache.johnzon.mapper;
 import static java.util.Collections.emptyMap;
 
 import org.apache.johnzon.mapper.access.FieldAccessMode;
+import org.apache.johnzon.mapper.converter.EnumConverter;
 import org.apache.johnzon.mapper.map.LazyConverterMap;
 import org.junit.Assert;
 import org.junit.Test;
@@ -169,7 +170,8 @@ public class MapperConfigTest {
                                 StandardCharsets.UTF_8,
                                 null,
                                 false, false, null, false, false, emptyMap(), true, false, true,
-                                null, null, null, null, null);
+                                null, null, null, null, null,
+                                type -> new EnumConverter(type));
     }
 
 
diff --git a/johnzon-mapper/src/test/java/org/superbiz/ExtendMappingTest.java b/johnzon-mapper/src/test/java/org/superbiz/ExtendMappingTest.java
index 27fdd0d..fb6ccf8 100644
--- a/johnzon-mapper/src/test/java/org/superbiz/ExtendMappingTest.java
+++ b/johnzon-mapper/src/test/java/org/superbiz/ExtendMappingTest.java
@@ -21,6 +21,7 @@ package org.superbiz;
 import org.apache.johnzon.mapper.MapperConfig;
 import org.apache.johnzon.mapper.Mappings;
 import org.apache.johnzon.mapper.access.FieldAccessMode;
+import org.apache.johnzon.mapper.converter.EnumConverter;
 import org.apache.johnzon.mapper.map.LazyConverterMap;
 import org.junit.Test;
 
@@ -62,7 +63,8 @@ public class ExtendMappingTest {
                     new FieldAccessMode(false, false),
                     StandardCharsets.UTF_8, String::compareTo, false, false, null, false, false,
                     emptyMap(), true, false, true,
-                    null, null, null, null, null));
+                    null, null, null, null, null,
+                    type -> new EnumConverter(type)));
         }
 
         @Override