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

commit bd46a434dd9a980c343dfa2415a23d95b4851c26
Author: Romain Manni-Bucau <[email protected]>
AuthorDate: Sat Aug 10 16:52:31 2019 +0200

    JOHNZON-236 ensure nillable conflicts are resolved properly
---
 johnzon-jsonb/pom.xml                              |  2 +-
 .../org/apache/johnzon/jsonb/JohnzonBuilder.java   | 11 +++-
 .../org/apache/johnzon/jsonb/JsonbAccessMode.java  | 29 ++++++---
 .../serializer/JohnzonDeserializationContext.java  | 19 +++---
 .../org/apache/johnzon/jsonb/NillableTest.java     | 54 ++++++++++++++++
 .../java/org/apache/johnzon/jsonb/OrderTest.java   | 71 ++++++++++++++++++++++
 .../apache/johnzon/jsonb/model/NillableType.java   | 26 ++++++++
 .../model/nillable/NotNillablePropertyModel.java   | 26 ++++++++
 .../model/nillable/notnillable/StringHolder.java   | 31 ++++++++++
 .../model/nillable/notnillable/package-info.java   | 22 +++++++
 .../johnzon/jsonb/model/nillable/package-info.java | 22 +++++++
 .../johnzon/mapper/MappingGeneratorImpl.java       |  2 +-
 .../java/org/apache/johnzon/mapper/Mappings.java   | 16 ++---
 .../apache/johnzon/mapper/access/AccessMode.java   |  2 +-
 .../johnzon/mapper/access/FieldAccessMode.java     |  4 +-
 .../mapper/access/FieldAndMethodAccessMode.java    |  4 +-
 .../johnzon/mapper/access/MethodAccessMode.java    |  4 +-
 .../johnzon/mapper/AdvancedGenericsTest.java       |  2 +-
 18 files changed, 313 insertions(+), 34 deletions(-)

diff --git a/johnzon-jsonb/pom.xml b/johnzon-jsonb/pom.xml
index 21d8928..242f514 100644
--- a/johnzon-jsonb/pom.xml
+++ b/johnzon-jsonb/pom.xml
@@ -58,7 +58,7 @@
     <dependency>
       <groupId>org.apache.geronimo.specs</groupId>
       <artifactId>geronimo-jsonb_1.0_spec</artifactId>
-      <version>1.1</version>
+      <version>1.2-SNAPSHOT</version> <!-- contains important fixes about 
JsonbConfig -->
       <scope>provided</scope>
     </dependency>
 
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 9dcbb59..eaf4465 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
@@ -157,7 +157,13 @@ public class JohnzonBuilder implements JsonbBuilder {
         }
 
         config.getProperty(JsonbConfig.ENCODING).ifPresent(encoding -> 
builder.setEncoding(String.valueOf(encoding)));
-        config.getProperty(JsonbConfig.NULL_VALUES).ifPresent(serNulls -> 
builder.setSkipNull(!Boolean.class.cast(serNulls)));
+        final boolean isNillable = config.getProperty(JsonbConfig.NULL_VALUES)
+                .map(it -> String.class.isInstance(it) ? 
Boolean.parseBoolean(it.toString()) : Boolean.class.cast(it))
+                .map(serNulls -> {
+                    builder.setSkipNull(!serNulls);
+                    return serNulls;
+                })
+                .orElse(false);
 
         final Optional<Object> namingStrategyValue = 
config.getProperty(JsonbConfig.PROPERTY_NAMING_STRATEGY);
 
@@ -218,7 +224,8 @@ public class JohnzonBuilder implements JsonbBuilder {
                                 .orElseGet(() -> new 
FieldAndMethodAccessMode(true, true, false)),
                         
config.getProperty("johnzon.failOnMissingCreatorValues")
                               .map(it -> String.class.isInstance(it) ? 
Boolean.parseBoolean(it.toString()) : Boolean.class.cast(it))
-                              .orElse(true) /*spec 1.0 requirement*/));
+                              .orElse(true) /*spec 1.0 requirement*/,
+                        isNillable));
         builder.setAccessMode(accessMode);
 
         // user adapters
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 fcedbc5..c08d529 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
@@ -139,14 +139,19 @@ public class JsonbAccessMode implements AccessMode, 
Closeable {
     };
     private boolean failOnMissingCreatorValues;
     private final Types types = new Types();
+    private final boolean globalIsNillable;
 
+    // CHECKSTYLE:OFF
     public JsonbAccessMode(final PropertyNamingStrategy 
propertyNamingStrategy, final String orderValue,
                            final PropertyVisibilityStrategy 
visibilityStrategy, final boolean caseSensitive,
                            final Map<AdapterKey, Adapter<?, ?>> 
defaultConverters, final JohnzonAdapterFactory factory,
                            final JsonProvider jsonProvider, final 
Supplier<JsonBuilderFactory> builderFactory,
                            final Supplier<JsonParserFactory> parserFactory,
                            final AccessMode delegate,
-                           final boolean failOnMissingCreatorValues) {
+                           final boolean failOnMissingCreatorValues,
+                           final boolean globalIsNillable) {
+        // CHECKSTYLE:ON
+        this.globalIsNillable = globalIsNillable;
         this.naming = propertyNamingStrategy;
         this.order = orderValue;
         this.visibility = visibilityStrategy;
@@ -459,7 +464,7 @@ public class JsonbAccessMode implements AccessMode, 
Closeable {
             final WriterConverters writerConverters = new 
WriterConverters(initialReader, types);
             final JsonbProperty property = 
initialReader.getAnnotation(JsonbProperty.class);
             final JsonbNillable nillable = 
initialReader.getClassOrPackageAnnotation(JsonbNillable.class);
-            final boolean isNillable = nillable != null || (property != null 
&& property.nillable());
+            final boolean isNillable = isNillable(property, nillable);
             final String key = property == null || property.value().isEmpty() 
? naming.translateName(entry.getKey()) : property.value();
             if (result.put(key, new Reader() {
                 @Override
@@ -493,7 +498,7 @@ public class JsonbAccessMode implements AccessMode, 
Closeable {
                 }
 
                 @Override
-                public boolean isNillable() {
+                public boolean isNillable(final boolean global) {
                     return isNillable;
                 }
             }) != null) {
@@ -551,7 +556,7 @@ public class JsonbAccessMode implements AccessMode, 
Closeable {
             final ReaderConverters converters = new 
ReaderConverters(initialWriter);
             final JsonbProperty property = 
initialWriter.getAnnotation(JsonbProperty.class);
             final JsonbNillable nillable = 
initialWriter.getClassOrPackageAnnotation(JsonbNillable.class);
-            final boolean isNillable = nillable != null || (property != null 
&& property.nillable());
+            final boolean isNillable = isNillable(property, nillable);
             final String key = property == null || property.value().isEmpty() 
? naming.translateName(entry.getKey()) : property.value();
             if (result.put(key, new Writer() {
                 @Override
@@ -585,7 +590,7 @@ public class JsonbAccessMode implements AccessMode, 
Closeable {
                 }
 
                 @Override
-                public boolean isNillable() {
+                public boolean isNillable(final boolean global) {
                     return isNillable;
                 }
             }) != null) {
@@ -649,6 +654,16 @@ public class JsonbAccessMode implements AccessMode, 
Closeable {
                 });
     }
 
+    private boolean isNillable(final JsonbProperty property, final 
JsonbNillable nillable) {
+        if (property != null) {
+            return property.nillable();
+        }
+        if (nillable != null) {
+            return nillable.value();
+        }
+        return globalIsNillable;
+    }
+
     private ParsingCacheEntry getClassEntry(final Class<?> clazz) {
         ParsingCacheEntry cache = parsingCache.get(clazz);
         if (cache == null) {
@@ -937,8 +952,8 @@ public class JsonbAccessMode implements AccessMode, 
Closeable {
         }
 
         @Override
-        public boolean isNillable() {
-            return false;
+        public boolean isNillable(final boolean global) {
+            return global;
         }
     }
 
diff --git 
a/johnzon-jsonb/src/main/java/org/apache/johnzon/jsonb/serializer/JohnzonDeserializationContext.java
 
b/johnzon-jsonb/src/main/java/org/apache/johnzon/jsonb/serializer/JohnzonDeserializationContext.java
index f64b034..a3b58dd 100644
--- 
a/johnzon-jsonb/src/main/java/org/apache/johnzon/jsonb/serializer/JohnzonDeserializationContext.java
+++ 
b/johnzon-jsonb/src/main/java/org/apache/johnzon/jsonb/serializer/JohnzonDeserializationContext.java
@@ -58,15 +58,20 @@ public class JohnzonDeserializationContext implements 
DeserializationContext {
         final JsonParser.Event next = 
/*RewindableJsonParser.class.isInstance(parser) ?
                 RewindableJsonParser.class.cast(parser).getLast() : */ 
parser.next();
         switch (next) {
-            case START_OBJECT:
+            case START_OBJECT: {
                 final JsonObjectBuilder objectBuilder = 
builderFactory.createObjectBuilder();
-                parseObject(parser, objectBuilder);
+                parseObject(null, parser, objectBuilder);
                 return objectBuilder.build();
+            }
             case START_ARRAY:
                 final JsonArrayBuilder arrayBuilder = 
builderFactory.createArrayBuilder();
                 parseArray(parser, arrayBuilder);
                 return arrayBuilder.build();
-            case KEY_NAME:
+            case KEY_NAME: { // object
+                final JsonObjectBuilder objectBuilder = 
builderFactory.createObjectBuilder();
+                parseObject(parser.getString(), parser, objectBuilder);
+                return objectBuilder.build();
+            }
             case VALUE_STRING:
                 return jsonp.createValue(parser.getString());
             case VALUE_FALSE:
@@ -82,8 +87,8 @@ public class JohnzonDeserializationContext implements 
DeserializationContext {
         }
     }
 
-    private void parseObject(final JsonParser parser, final JsonObjectBuilder 
builder) {
-        String key = null;
+    private void parseObject(final String originalKey, final JsonParser 
parser, final JsonObjectBuilder builder) {
+        String key = originalKey;
         while (parser.hasNext()) {
             final JsonParser.Event next = parser.next();
             switch (next) {
@@ -97,7 +102,7 @@ public class JohnzonDeserializationContext implements 
DeserializationContext {
 
                 case START_OBJECT:
                     final JsonObjectBuilder subObject = 
builderFactory.createObjectBuilder();
-                    parseObject(parser, subObject);
+                    parseObject(null, parser, subObject);
                     builder.add(key, subObject);
                     break;
 
@@ -157,7 +162,7 @@ public class JohnzonDeserializationContext implements 
DeserializationContext {
 
                 case START_OBJECT:
                     final JsonObjectBuilder subObject = 
builderFactory.createObjectBuilder();
-                    parseObject(parser, subObject);
+                    parseObject(null, parser, subObject);
                     builder.add(subObject);
                     break;
 
diff --git 
a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/NillableTest.java 
b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/NillableTest.java
new file mode 100644
index 0000000..afa3f9b
--- /dev/null
+++ b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/NillableTest.java
@@ -0,0 +1,54 @@
+/*
+ * 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 static org.junit.Assert.assertEquals;
+
+import javax.json.bind.Jsonb;
+import javax.json.bind.JsonbBuilder;
+import javax.json.bind.JsonbConfig;
+
+import org.apache.johnzon.jsonb.model.NillableType;
+import org.apache.johnzon.jsonb.model.nillable.NotNillablePropertyModel;
+import org.apache.johnzon.jsonb.model.nillable.notnillable.StringHolder;
+import org.apache.johnzon.jsonb.test.JsonbRule;
+import org.junit.Rule;
+import org.junit.Test;
+
+public class NillableTest {
+    @Rule
+    public final JsonbRule jsonb = new JsonbRule();
+
+    @Test
+    public void propertyWinsOverPackage() {
+        assertEquals("{}", jsonb.toJson(new NotNillablePropertyModel()));
+    }
+
+    @Test
+    public void globalNillableConfigInNonNullablePackage() throws Exception {
+        try (final Jsonb jsonb = JsonbBuilder.create(new 
JsonbConfig().withNullValues(true))) {
+            assertEquals("{}", jsonb.toJson(new StringHolder()));
+        }
+    }
+
+    @Test
+    public void type() {
+        assertEquals("{\"value\":null}", jsonb.toJson(new NillableType()));
+    }
+}
diff --git 
a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/OrderTest.java 
b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/OrderTest.java
index 631a070..355032d 100644
--- a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/OrderTest.java
+++ b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/OrderTest.java
@@ -22,6 +22,8 @@ import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
 
 import java.lang.reflect.Type;
+import java.util.LinkedList;
+import java.util.List;
 
 import javax.json.bind.annotation.JsonbPropertyOrder;
 import javax.json.bind.annotation.JsonbTypeDeserializer;
@@ -64,6 +66,24 @@ public class OrderTest {
         assertEquals("Test String Deserialized", 
unmarshalledObject.getInstance().getInstance());
     }
 
+    @Test
+    public void arrayTypes() {
+        final ArrayHolder container = new ArrayHolder();
+        final StringHolder instance1 = new StringHolder();
+        instance1.setInstance("Test String 1");
+        final StringHolder instance2 = new StringHolder();
+        instance2.setInstance("Test String 2");
+        container.setInstance(new StringHolder[] { instance1, instance2 });
+
+        final String json = jsonb.toJson(container);
+        assertEquals("{\"instance\":[{\"instance\":\"Test String 
1\"},{\"instance\":\"Test String 2\"}]}", json);
+
+        final ArrayHolder unmarshalledObject = jsonb.fromJson(
+                "{ \"instance\" : [ { \"instance\" : \"Test String 1\" }, { 
\"instance\" : \"Test String 2\" } ] }",
+                ArrayHolder.class);
+        assertEquals("Test String 1", 
unmarshalledObject.getInstance()[0].getInstance());
+    }
+
     public static class StringHolder implements Holder<String> {
         private String instance = "Test";
 
@@ -124,6 +144,57 @@ public class OrderTest {
         }
     }
 
+    public static class ArrayHolder implements Holder<StringHolder[]> {
+        @JsonbTypeSerializer(StringArraySerializer.class)
+        @JsonbTypeDeserializer(StringArrayDeserializer.class)
+        private StringHolder[] instance;
+
+        @Override
+        public StringHolder[] getInstance() {
+            return instance;
+        }
+
+        @Override
+        public void setInstance(final StringHolder[] instance) {
+            this.instance = instance;
+        }
+    }
+
+    public static class StringArraySerializer implements 
JsonbSerializer<StringHolder[]> {
+        @Override
+        public void serialize(final StringHolder[] containers,
+                              final JsonGenerator jsonGenerator,
+                              final SerializationContext serializationContext) 
{
+            jsonGenerator.writeStartArray();
+            for (final StringHolder container : containers) {
+                serializationContext.serialize(container, jsonGenerator);
+            }
+            jsonGenerator.writeEnd();
+        }
+    }
+
+    public static class StringArrayDeserializer implements 
JsonbDeserializer<StringHolder[]> {
+        @Override
+        public StringHolder[] deserialize(final JsonParser jsonParser,
+                                          final DeserializationContext 
deserializationContext,
+                                          final Type type) {
+            final List<StringHolder> containers = new LinkedList<>();
+
+            while (jsonParser.hasNext()) {
+                JsonParser.Event event = jsonParser.next();
+                if (event == JsonParser.Event.START_OBJECT) {
+                    containers.add(deserializationContext.deserialize(
+                            new StringHolder() 
{}.getClass().getGenericSuperclass(), jsonParser));
+                }
+                if (event == JsonParser.Event.END_OBJECT) {
+                    break;
+                }
+            }
+
+            return containers.toArray(new StringHolder[0]);
+        }
+    }
+
     @JsonbPropertyOrder({ "third", "fourth" })
     public class PartialModel {
         private String first = "First";
diff --git 
a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/model/NillableType.java 
b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/model/NillableType.java
new file mode 100644
index 0000000..7b3bfc3
--- /dev/null
+++ 
b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/model/NillableType.java
@@ -0,0 +1,26 @@
+/*
+ * 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.model;
+
+import javax.json.bind.annotation.JsonbNillable;
+
+@JsonbNillable
+public class NillableType {
+    public String value;
+}
diff --git 
a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/model/nillable/NotNillablePropertyModel.java
 
b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/model/nillable/NotNillablePropertyModel.java
new file mode 100644
index 0000000..7f1aeb7
--- /dev/null
+++ 
b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/model/nillable/NotNillablePropertyModel.java
@@ -0,0 +1,26 @@
+/*
+ * 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.model.nillable;
+
+import javax.json.bind.annotation.JsonbProperty;
+
+public class NotNillablePropertyModel {
+    @JsonbProperty(nillable = false)
+    public String value;
+}
diff --git 
a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/model/nillable/notnillable/StringHolder.java
 
b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/model/nillable/notnillable/StringHolder.java
new file mode 100644
index 0000000..ced103c
--- /dev/null
+++ 
b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/model/nillable/notnillable/StringHolder.java
@@ -0,0 +1,31 @@
+/*
+ * 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.model.nillable.notnillable;
+
+public class StringHolder {
+    private String string;
+
+    public String getString() {
+        return string;
+    }
+
+    public void setString(final String string) {
+        this.string = string;
+    }
+}
diff --git 
a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/model/nillable/notnillable/package-info.java
 
b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/model/nillable/notnillable/package-info.java
new file mode 100644
index 0000000..f548116
--- /dev/null
+++ 
b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/model/nillable/notnillable/package-info.java
@@ -0,0 +1,22 @@
+/*
+ * 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.
+ */
+@JsonbNillable(false)
+package org.apache.johnzon.jsonb.model.nillable.notnillable;
+
+import javax.json.bind.annotation.JsonbNillable;
diff --git 
a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/model/nillable/package-info.java
 
b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/model/nillable/package-info.java
new file mode 100644
index 0000000..5071b4e
--- /dev/null
+++ 
b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/model/nillable/package-info.java
@@ -0,0 +1,22 @@
+/*
+ * 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.
+ */
+@JsonbNillable
+package org.apache.johnzon.jsonb.model.nillable;
+
+import javax.json.bind.annotation.JsonbNillable;
diff --git 
a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MappingGeneratorImpl.java
 
b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MappingGeneratorImpl.java
index 34ae88e..e80629a 100644
--- 
a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MappingGeneratorImpl.java
+++ 
b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MappingGeneratorImpl.java
@@ -329,7 +329,7 @@ public class MappingGeneratorImpl implements 
MappingGenerator {
             }
 
             if (value == null) {
-                if (config.isSkipNull() && !getter.reader.isNillable()) {
+                if (!getter.reader.isNillable(!config.isSkipNull())) {
                     continue;
                 } else {
                     generator.writeNull(getterEntry.getKey());
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 16b42fe..e60e8f8 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
@@ -686,8 +686,8 @@ public class Mappings {
         }
 
         @Override
-        public boolean isNillable() {
-            return false;
+        public boolean isNillable(final boolean globalConfig) {
+            return globalConfig;
         }
     }
 
@@ -765,8 +765,8 @@ public class Mappings {
         }
 
         @Override
-        public boolean isNillable() {
-            return false;
+        public boolean isNillable(final boolean globalConfig) {
+            return globalConfig;
         }
     }
 
@@ -842,9 +842,9 @@ public class Mappings {
         }
 
         @Override
-        public boolean isNillable() {
+        public boolean isNillable(final boolean global) {
             for (final AccessMode.Reader r : delegates) {
-                if (r.isNillable()) {
+                if (r.isNillable(global)) {
                     return true;
                 }
             }
@@ -912,9 +912,9 @@ public class Mappings {
         }
 
         @Override
-        public boolean isNillable() {
+        public boolean isNillable(final boolean global) {
             for (final AccessMode.Writer r : delegates) {
-                if (r.isNillable()) {
+                if (r.isNillable(global)) {
                     return true;
                 }
             }
diff --git 
a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/access/AccessMode.java 
b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/access/AccessMode.java
index 6c95675..ece888b 100644
--- 
a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/access/AccessMode.java
+++ 
b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/access/AccessMode.java
@@ -75,7 +75,7 @@ public interface AccessMode {
         <T extends Annotation> T getAnnotation(Class<T> clazz);
         <T extends Annotation> T getClassOrPackageAnnotation(Class<T> clazz);
         Adapter<?, ?> findConverter();
-        boolean isNillable();
+        boolean isNillable(boolean globalConfig);
     }
 
     interface Writer extends DecoratedType {
diff --git 
a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/access/FieldAccessMode.java
 
b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/access/FieldAccessMode.java
index 95a9780..e1de549 100644
--- 
a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/access/FieldAccessMode.java
+++ 
b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/access/FieldAccessMode.java
@@ -132,8 +132,8 @@ public class FieldAccessMode extends BaseAccessMode {
         }
 
         @Override
-        public boolean isNillable() {
-            return false;
+        public boolean isNillable(final boolean global) {
+            return global;
         }
     }
 
diff --git 
a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/access/FieldAndMethodAccessMode.java
 
b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/access/FieldAndMethodAccessMode.java
index c61ead7..ea5a651 100644
--- 
a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/access/FieldAndMethodAccessMode.java
+++ 
b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/access/FieldAndMethodAccessMode.java
@@ -220,8 +220,8 @@ public class FieldAndMethodAccessMode extends 
BaseAccessMode {
         }
 
         @Override
-        public boolean isNillable() {
-            return type1.isNillable() || type2.isNillable();
+        public boolean isNillable(final boolean global) {
+            return type1.isNillable(global) || type2.isNillable(global);
         }
 
         public DecoratedType getType1() {
diff --git 
a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/access/MethodAccessMode.java
 
b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/access/MethodAccessMode.java
index 959d69f..fbaf167 100644
--- 
a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/access/MethodAccessMode.java
+++ 
b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/access/MethodAccessMode.java
@@ -139,8 +139,8 @@ public class MethodAccessMode extends BaseAccessMode {
         }
 
         @Override
-        public boolean isNillable() {
-            return false;
+        public boolean isNillable(final boolean global) {
+            return global;
         }
     }
 
diff --git 
a/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/AdvancedGenericsTest.java
 
b/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/AdvancedGenericsTest.java
index 7dcdb83..fb0e219 100644
--- 
a/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/AdvancedGenericsTest.java
+++ 
b/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/AdvancedGenericsTest.java
@@ -48,7 +48,7 @@ public class AdvancedGenericsTest {
 
             Assert.assertTrue("Serialized String must contain 
\"firstName\":\"Bruce\"", customerAsString.contains("\"firstName\":\"Bruce\""));
             Assert.assertTrue("Serialized String must contain 
\"lastName\":\"Wayne\"", customerAsString.contains("\"lastName\":\"Wayne\""));
-            Assert.assertFalse("Serialized String must not contain \"id\"", 
customerAsString.contains("\"id\""));
+            Assert.assertFalse("Serialized String must not contain \"id\": " + 
customerAsString, customerAsString.contains("\"id\""));
             Assert.assertFalse("Serialized String must not contain 
\"version\"", customerAsString.contains("\"version\""));
         }
 

Reply via email to