Repository: johnzon Updated Branches: refs/heads/master 174ffa5ba -> f48879137
JOHNZON-109 fail on unknown properties support Project: http://git-wip-us.apache.org/repos/asf/johnzon/repo Commit: http://git-wip-us.apache.org/repos/asf/johnzon/commit/f4887913 Tree: http://git-wip-us.apache.org/repos/asf/johnzon/tree/f4887913 Diff: http://git-wip-us.apache.org/repos/asf/johnzon/diff/f4887913 Branch: refs/heads/master Commit: f48879137e8cb5fcc62ff24a4863658a8f868079 Parents: 174ffa5 Author: rmannibucau <[email protected]> Authored: Fri Mar 17 16:22:20 2017 +0100 Committer: rmannibucau <[email protected]> Committed: Fri Mar 17 16:22:20 2017 +0100 ---------------------------------------------------------------------- .../org/apache/johnzon/core/JsonReaderImpl.java | 2 +- .../jaxrs/ConfigurableJohnzonProvider.java | 4 ++ .../WildcardConfigurableJohnzonProvider.java | 16 +++--- .../jaxrs/jsonb/jaxrs/JsonbJaxrsProvider.java | 4 ++ .../apache/johnzon/jsonb/JohnzonBuilder.java | 1 + .../jsonb/FailOnUnknownPropertiesTest.java | 56 ++++++++++++++++++++ .../java/org/apache/johnzon/mapper/Mapper.java | 2 +- .../apache/johnzon/mapper/MapperBuilder.java | 8 ++- .../org/apache/johnzon/mapper/MapperConfig.java | 8 ++- .../johnzon/mapper/MappingParserImpl.java | 53 ++++++++++-------- .../apache/johnzon/mapper/MapperConfigTest.java | 2 +- .../java/org/superbiz/ExtendMappingTest.java | 2 +- .../main/java/javax/json/bind/JsonbConfig.java | 17 ++++++ 13 files changed, 142 insertions(+), 33 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/johnzon/blob/f4887913/johnzon-core/src/main/java/org/apache/johnzon/core/JsonReaderImpl.java ---------------------------------------------------------------------- diff --git a/johnzon-core/src/main/java/org/apache/johnzon/core/JsonReaderImpl.java b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonReaderImpl.java index b0107ee..a209a56 100644 --- a/johnzon-core/src/main/java/org/apache/johnzon/core/JsonReaderImpl.java +++ b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonReaderImpl.java @@ -42,7 +42,7 @@ public class JsonReaderImpl implements JsonReader { return JsonStructure.class.cast(readValue()); } - //@Override + @Override public JsonValue readValue() { checkClosed(); http://git-wip-us.apache.org/repos/asf/johnzon/blob/f4887913/johnzon-jaxrs/src/main/java/org/apache/johnzon/jaxrs/ConfigurableJohnzonProvider.java ---------------------------------------------------------------------- diff --git a/johnzon-jaxrs/src/main/java/org/apache/johnzon/jaxrs/ConfigurableJohnzonProvider.java b/johnzon-jaxrs/src/main/java/org/apache/johnzon/jaxrs/ConfigurableJohnzonProvider.java index dd8b79c..6e35b0a 100644 --- a/johnzon-jaxrs/src/main/java/org/apache/johnzon/jaxrs/ConfigurableJohnzonProvider.java +++ b/johnzon-jaxrs/src/main/java/org/apache/johnzon/jaxrs/ConfigurableJohnzonProvider.java @@ -116,6 +116,10 @@ public class ConfigurableJohnzonProvider<T> implements MessageBodyWriter<T>, Mes } } + public void setFailOnUnknownProperties(final boolean active) { + builder.setFailOnUnknownProperties(active); + } + public void setSupportConstructors(final boolean supportConstructors) { builder.setSupportConstructors(supportConstructors); } http://git-wip-us.apache.org/repos/asf/johnzon/blob/f4887913/johnzon-jaxrs/src/main/java/org/apache/johnzon/jaxrs/WildcardConfigurableJohnzonProvider.java ---------------------------------------------------------------------- diff --git a/johnzon-jaxrs/src/main/java/org/apache/johnzon/jaxrs/WildcardConfigurableJohnzonProvider.java b/johnzon-jaxrs/src/main/java/org/apache/johnzon/jaxrs/WildcardConfigurableJohnzonProvider.java index 4df4a7c..2ca7e12 100644 --- a/johnzon-jaxrs/src/main/java/org/apache/johnzon/jaxrs/WildcardConfigurableJohnzonProvider.java +++ b/johnzon-jaxrs/src/main/java/org/apache/johnzon/jaxrs/WildcardConfigurableJohnzonProvider.java @@ -43,14 +43,14 @@ import static java.util.Arrays.asList; @Provider @Produces({ - "*/json", - "*/*+json", "*/x-json", - "*/javascript", "*/x-javascript" + "*/json", + "*/*+json", "*/x-json", + "*/javascript", "*/x-javascript" }) @Consumes({ - "*/json", - "*/*+json", "*/x-json", - "*/javascript", "*/x-javascript" + "*/json", + "*/*+json", "*/x-json", + "*/javascript", "*/x-javascript" }) public class WildcardConfigurableJohnzonProvider<T> implements MessageBodyWriter<T>, MessageBodyReader<T> { // build/configuration @@ -124,6 +124,10 @@ public class WildcardConfigurableJohnzonProvider<T> implements MessageBodyWriter } } + public void setFailOnUnknownProperties(final boolean active) { + builder.setFailOnUnknownProperties(active); + } + public void setSupportConstructors(final boolean supportConstructors) { builder.setSupportConstructors(supportConstructors); } http://git-wip-us.apache.org/repos/asf/johnzon/blob/f4887913/johnzon-jsonb/src/main/java/org/apache/johnzon/jaxrs/jsonb/jaxrs/JsonbJaxrsProvider.java ---------------------------------------------------------------------- diff --git a/johnzon-jsonb/src/main/java/org/apache/johnzon/jaxrs/jsonb/jaxrs/JsonbJaxrsProvider.java b/johnzon-jsonb/src/main/java/org/apache/johnzon/jaxrs/jsonb/jaxrs/JsonbJaxrsProvider.java index 189dce4..fc17494 100644 --- a/johnzon-jsonb/src/main/java/org/apache/johnzon/jaxrs/jsonb/jaxrs/JsonbJaxrsProvider.java +++ b/johnzon-jsonb/src/main/java/org/apache/johnzon/jaxrs/jsonb/jaxrs/JsonbJaxrsProvider.java @@ -68,6 +68,10 @@ public class JsonbJaxrsProvider<T> implements MessageBodyWriter<T>, MessageBodyR } // config - main containers support the configuration of providers this way + public void setFailOnUnknownProperties(final boolean active) { + config.withFailOnUnknownProperties(active); + } + public void setIJson(final boolean active) { config.withStrictIJSON(active); } http://git-wip-us.apache.org/repos/asf/johnzon/blob/f4887913/johnzon-jsonb/src/main/java/org/apache/johnzon/jsonb/JohnzonBuilder.java ---------------------------------------------------------------------- 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 137cf4c..a3a86ba 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 @@ -253,6 +253,7 @@ public class JohnzonBuilder implements JsonbBuilder { config.getProperty(JsonbConfig.STRICT_IJSON).map(Boolean.class::cast).ifPresent(ijson -> { // no-op: https://tools.ietf.org/html/rfc7493 the only MUST of the spec should be fine by default }); + config.getProperty(JsonbConfig.FAIL_ON_UNKNOWN_PROPERTIES).map(Boolean.class::cast).ifPresent(builder::setFailOnUnknownProperties); config.getProperty(JsonbConfig.BINARY_DATA_STRATEGY).map(String.class::cast).ifPresent(bin -> { switch (bin) { http://git-wip-us.apache.org/repos/asf/johnzon/blob/f4887913/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/FailOnUnknownPropertiesTest.java ---------------------------------------------------------------------- diff --git a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/FailOnUnknownPropertiesTest.java b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/FailOnUnknownPropertiesTest.java new file mode 100644 index 0000000..0c52308 --- /dev/null +++ b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/FailOnUnknownPropertiesTest.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.junit.Test; + +import javax.json.bind.Jsonb; +import javax.json.bind.JsonbBuilder; +import javax.json.bind.JsonbConfig; +import javax.json.bind.JsonbException; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.fail; + +public class FailOnUnknownPropertiesTest { + @Test + public void failOnUnknownProperties() { + final Jsonb jsonb = JsonbBuilder.create(new JsonbConfig().withFailOnUnknownProperties(true)); + + // valid + assertEquals("ok", jsonb.fromJson("{\"known\":\"ok\"}", Model.class).known); + + try { // invalid + assertEquals("ok", jsonb.fromJson("{\"known\":\"ok\",\"unknown\":\"whatever\"}", Model.class).known); + fail(); + } catch (final JsonbException jsone) { + assertEquals("(fail on unknown properties): [unknown]", jsone.getMessage()); + } + try { // invalid but a missing key from the model + assertEquals("ok", jsonb.fromJson("{\"unknown\":\"whatever\"}", Model.class).known); + fail(); + } catch (final JsonbException jsone) { + assertEquals("(fail on unknown properties): [unknown]", jsone.getMessage()); + } + } + + public static class Model { + public String known; + } +} http://git-wip-us.apache.org/repos/asf/johnzon/blob/f4887913/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/Mapper.java ---------------------------------------------------------------------- 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 58aed8b..9fe2bc8 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 @@ -63,7 +63,7 @@ public class Mapper implements Closeable { this.mappings = new Mappings(config); this.readerHandler = ReaderHandler.create(readerFactory); this.closeables = closeables; - this.charset = config.getEncoding() == null ? null : config.getEncoding(); + this.charset = config.getEncoding(); } http://git-wip-us.apache.org/repos/asf/johnzon/blob/f4887913/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MapperBuilder.java ---------------------------------------------------------------------- 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 b3e57eb..606e7a9 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 @@ -129,6 +129,7 @@ public class MapperBuilder { private Map<Class<?>, ObjectConverter.Writer<?>> objectConverterWriters = new HashMap<Class<?>, ObjectConverter.Writer<?>>(); private Map<Class<?>, String[]> ignoredForFields = new HashMap<Class<?>, String[]>(); private boolean primitiveConverters; + private boolean failOnUnknownProperties; public Mapper build() { if (readerFactory == null || generatorFactory == null) { @@ -215,10 +216,15 @@ public class MapperBuilder { version, close, skipNull, skipEmptyArray, treatByteArrayAsBase64, treatByteArrayAsBase64URL, readAttributeBeforeWrite, - accessMode, encoding, attributeOrder, enforceQuoteString), + accessMode, encoding, attributeOrder, enforceQuoteString, failOnUnknownProperties), closeables); } + public MapperBuilder setFailOnUnknownProperties(final boolean failOnUnknownProperties) { + this.failOnUnknownProperties = failOnUnknownProperties; + return this; + } + public MapperBuilder addCloseable(final Closeable closeable) { closeables.add(closeable); return this; http://git-wip-us.apache.org/repos/asf/johnzon/blob/f4887913/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MapperConfig.java ---------------------------------------------------------------------- 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 efb38f6..7b84f7a 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 @@ -63,6 +63,7 @@ public /* DON'T MAKE IT HIDDEN */ class MapperConfig implements Cloneable { private final Map<Class<?>, ObjectConverter.Reader<?>> objectConverterReaders; private final Comparator<String> attributeOrder; private final boolean enforceQuoteString; + private final boolean failOnUnknown; private final Map<Class<?>, ObjectConverter.Writer<?>> objectConverterWriterCache; private final Map<Class<?>, ObjectConverter.Reader<?>> objectConverterReaderCache; @@ -78,7 +79,7 @@ public /* DON'T MAKE IT HIDDEN */ class MapperConfig implements Cloneable { final boolean readAttributeBeforeWrite, final AccessMode accessMode, final Charset encoding, final Comparator<String> attributeOrder, - final boolean enforceQuoteString) { + final boolean enforceQuoteString, final boolean failOnUnknown) { //CHECKSTYLE:ON this.objectConverterWriters = objectConverterWriters; this.objectConverterReaders = objectConverterReaders; @@ -94,6 +95,7 @@ public /* DON'T MAKE IT HIDDEN */ class MapperConfig implements Cloneable { this.adapters = adapters; this.attributeOrder = attributeOrder; this.enforceQuoteString = enforceQuoteString; + this.failOnUnknown = failOnUnknown; this.objectConverterWriterCache = new HashMap<Class<?>, ObjectConverter.Writer<?>>(objectConverterWriters.size()); this.objectConverterReaderCache = new HashMap<Class<?>, ObjectConverter.Reader<?>>(objectConverterReaders.size()); @@ -220,6 +222,10 @@ public /* DON'T MAKE IT HIDDEN */ class MapperConfig implements Cloneable { return converter; } + public boolean isFailOnUnknown() { + return failOnUnknown; + } + public int getVersion() { return version; } http://git-wip-us.apache.org/repos/asf/johnzon/blob/f4887913/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 9164f7a..3e2a66e 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 @@ -19,7 +19,6 @@ package org.apache.johnzon.mapper; import org.apache.johnzon.core.JsonLongImpl; -import org.apache.johnzon.core.JsonReaderImpl; import org.apache.johnzon.mapper.access.AccessMode; import org.apache.johnzon.mapper.converter.CharacterConverter; import org.apache.johnzon.mapper.converter.EnumConverter; @@ -82,6 +81,17 @@ public class MappingParserImpl implements MappingParser { private static final Adapter<Object, String> FALLBACK_CONVERTER = new ConverterAdapter<Object>(new FallbackConverter()); private static final JohnzonParameterizedType ANY_LIST = new JohnzonParameterizedType(List.class, Object.class); private static final CharacterConverter CHARACTER_CONVERTER = new CharacterConverter(); // this one is particular, share the logic + private static final boolean HAS_READ_VALUE; + static { + boolean hasReadValue; // v1.0 vs v1.1 + try { + JsonReader.class.getDeclaredMethod("readValue"); + hasReadValue = true; + } catch (final Error | NoSuchMethodException e) { + hasReadValue = false; + } + HAS_READ_VALUE = hasReadValue; + } protected final ConcurrentMap<Adapter<?, ?>, AdapterKey> reverseAdaptersRegistry; protected final ConcurrentMap<Class<?>, Method> valueOfs = new ConcurrentHashMap<Class<?>, Method>(); @@ -92,27 +102,20 @@ public class MappingParserImpl implements MappingParser { private final JsonReader jsonReader; - public MappingParserImpl(MapperConfig config, Mappings mappings, JsonReader jsonReader) { this.config = config; this.mappings = mappings; this.jsonReader = jsonReader; - reverseAdaptersRegistry = new ConcurrentHashMap<Adapter<?, ?>, AdapterKey>(config.getAdapters().size()); + reverseAdaptersRegistry = new ConcurrentHashMap<>(config.getAdapters().size()); } @Override public <T> T readObject(Type targetType) { - try { - if (jsonReader.getClass().getName().equals("org.apache.johnzon.core.JsonReaderImpl")) { - // later in JSON-P 1.1 we can remove this hack again - return readObject(((JsonReaderImpl) jsonReader).readValue(), targetType); - } - - return readObject(jsonReader.read(), targetType); + return readObject(HAS_READ_VALUE ? jsonReader.readValue() : jsonReader.read(), targetType); } finally { if (config.isClose()) { jsonReader.close(); @@ -287,6 +290,14 @@ public class MappingParserImpl implements MappingParser { throw new MapperException(classMapping.clazz + " not instantiable"); } + if (config.isFailOnUnknown()) { + if (!classMapping.setters.keySet().containsAll(object.keySet())) { + throw new MapperException("(fail on unknown properties): " + new HashSet<String>(object.keySet()) {{ + removeAll(classMapping.setters.keySet()); + }}); + } + } + final Object t = classMapping.factory.getParameterTypes().length == 0 ? classMapping.factory.create(null) : classMapping.factory.create(createParameters(classMapping, object)); for (final Map.Entry<String, Mappings.Setter> setter : classMapping.setters.entrySet()) { @@ -436,8 +447,8 @@ public class MappingParserImpl implements MappingParser { throw new MapperException("Unable to parse " + jsonValue + " to boolean"); } - if(config.isTreatByteArrayAsBase64() && jsonValue.getValueType() == JsonValue.ValueType.STRING && (type == byte[].class /*|| type == Byte[].class*/)) { - return DatatypeConverter.parseBase64Binary(((JsonString)jsonValue).getString()); + if (config.isTreatByteArrayAsBase64() && jsonValue.getValueType() == JsonValue.ValueType.STRING && (type == byte[].class /*|| type == Byte[].class*/)) { + return DatatypeConverter.parseBase64Binary(((JsonString) jsonValue).getString()); } if (Object.class == type) { // handling specific types here to keep exception in standard handling @@ -449,7 +460,7 @@ public class MappingParserImpl implements MappingParser { } if (JsonNumber.class.isInstance(jsonValue)) { final JsonNumber jsonNumber = JsonNumber.class.cast(jsonValue); - if(jsonNumber.isIntegral()) { + if (jsonNumber.isIntegral()) { return jsonNumber.intValue(); } return jsonNumber.doubleValue(); @@ -609,11 +620,11 @@ public class MappingParserImpl implements MappingParser { for (int i = 0; i < length; i++) { objects[i] = toValue(null, - object.get(mapping.factory.getParameterNames()[i]), - mapping.factory.getParameterConverter()[i], - mapping.factory.getParameterItemConverter()[i], - mapping.factory.getParameterTypes()[i], - null); //X TODO ObjectConverter in @JOhnzonConverter with Constructors! + object.get(mapping.factory.getParameterNames()[i]), + mapping.factory.getParameterConverter()[i], + mapping.factory.getParameterItemConverter()[i], + mapping.factory.getParameterTypes()[i], + null); //X TODO ObjectConverter in @JOhnzonConverter with Constructors! } return objects; @@ -632,8 +643,8 @@ public class MappingParserImpl implements MappingParser { } return converter == null ? toObject(baseInstance, jsonValue, type, itemConverter) - : jsonValue.getValueType() == JsonValue.ValueType.STRING ? converter.to(JsonString.class.cast(jsonValue).getString()) - : convertTo(converter, jsonValue); + : jsonValue.getValueType() == JsonValue.ValueType.STRING ? converter.to(JsonString.class.cast(jsonValue).getString()) + : convertTo(converter, jsonValue); } @@ -713,7 +724,7 @@ public class MappingParserImpl implements MappingParser { @Override public Object fromString(final String text) { throw new MapperException("Using fallback converter, " + - "this only works in write mode but not in read. Please register a custom converter to do so."); + "this only works in write mode but not in read. Please register a custom converter to do so."); } } http://git-wip-us.apache.org/repos/asf/johnzon/blob/f4887913/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/MapperConfigTest.java ---------------------------------------------------------------------- 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 f51ce91..ca693f4 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 @@ -166,7 +166,7 @@ public class MapperConfigTest { new FieldAccessMode(true, true), Charset.forName("UTF-8"), null, - false); + false, false); } http://git-wip-us.apache.org/repos/asf/johnzon/blob/f4887913/johnzon-mapper/src/test/java/org/superbiz/ExtendMappingTest.java ---------------------------------------------------------------------- diff --git a/johnzon-mapper/src/test/java/org/superbiz/ExtendMappingTest.java b/johnzon-mapper/src/test/java/org/superbiz/ExtendMappingTest.java index 14844bd..712a8e6 100644 --- a/johnzon-mapper/src/test/java/org/superbiz/ExtendMappingTest.java +++ b/johnzon-mapper/src/test/java/org/superbiz/ExtendMappingTest.java @@ -71,7 +71,7 @@ public class ExtendMappingTest { public int compare(final String o1, final String o2) { return o1.compareTo(o2); } - }, false)); + }, false, false)); } @Override http://git-wip-us.apache.org/repos/asf/johnzon/blob/f4887913/jsonb-api/src/main/java/javax/json/bind/JsonbConfig.java ---------------------------------------------------------------------- diff --git a/jsonb-api/src/main/java/javax/json/bind/JsonbConfig.java b/jsonb-api/src/main/java/javax/json/bind/JsonbConfig.java index 597c88c..528b1b9 100644 --- a/jsonb-api/src/main/java/javax/json/bind/JsonbConfig.java +++ b/jsonb-api/src/main/java/javax/json/bind/JsonbConfig.java @@ -32,6 +32,7 @@ import java.util.Optional; public class JsonbConfig { private final Map<String, Object> configuration = new HashMap<>(); + public static final String FAIL_ON_UNKNOWN_PROPERTIES = "jsonb.fail-on-unknown-properties"; public static final String FORMATTING = "jsonb.formatting"; public static final String ENCODING = "jsonb.encoding"; public static final String PROPERTY_NAMING_STRATEGY = "jsonb.property-naming-strategy"; @@ -46,6 +47,10 @@ public class JsonbConfig { public static final String SERIALIZERS = "jsonb.serializers"; public static final String DESERIALIZERS = "jsonb.derializers"; + public final JsonbConfig withFailOnUnknownProperties(final Boolean failOnUnknownProperties) { + return setProperty(FAIL_ON_UNKNOWN_PROPERTIES, failOnUnknownProperties); + } + public final JsonbConfig withDateFormat(final String dateFormat, final Locale locale) { return setProperty(DATE_FORMAT, dateFormat).setProperty(LOCALE, locale != null ? locale : Locale.getDefault()); } @@ -100,6 +105,18 @@ public class JsonbConfig { } public final JsonbConfig withAdapters(final JsonbAdapter... adapters) { + if (adapters == null || adapters.length == 0) { + return this; + } + + final Optional<Object> opt = getProperty(ADAPTERS); + if (opt.isPresent()) { + final JsonbAdapter[] existing = JsonbAdapter[].class.cast(opt.get()); + final JsonbAdapter[] aggregated = new JsonbAdapter[existing.length + adapters.length]; + System.arraycopy(existing, 0, aggregated, 0, existing.length); + System.arraycopy(adapters, 0, aggregated, existing.length + 1, adapters.length); + return setProperty(ADAPTERS, aggregated); + } return setProperty(ADAPTERS, adapters); }
