Fixed NPE for adapters returning null.
Signed-off-by: Roman Grigoriadi <roman.grigoriadi@oracle.com>
diff --git a/src/main/java/org/eclipse/yasson/internal/model/PropertyModel.java b/src/main/java/org/eclipse/yasson/internal/model/PropertyModel.java
index 53d195d..043df6b 100644
--- a/src/main/java/org/eclipse/yasson/internal/model/PropertyModel.java
+++ b/src/main/java/org/eclipse/yasson/internal/model/PropertyModel.java
@@ -17,9 +17,14 @@
import org.eclipse.yasson.internal.ReflectionUtils;
import org.eclipse.yasson.internal.components.AdapterBinding;
import org.eclipse.yasson.internal.components.SerializerBinding;
-import org.eclipse.yasson.internal.serializer.*;
import org.eclipse.yasson.internal.model.customization.PropertyCustomization;
import org.eclipse.yasson.internal.model.customization.PropertyCustomizationBuilder;
+import org.eclipse.yasson.internal.serializer.AdaptedObjectSerializer;
+import org.eclipse.yasson.internal.serializer.DefaultSerializers;
+import org.eclipse.yasson.internal.serializer.JsonbDateFormatter;
+import org.eclipse.yasson.internal.serializer.JsonbNumberFormatter;
+import org.eclipse.yasson.internal.serializer.SerializerProviderWrapper;
+import org.eclipse.yasson.internal.serializer.UserSerializerSerializer;
import javax.json.bind.config.PropertyNamingStrategy;
import javax.json.bind.serializer.JsonbSerializer;
diff --git a/src/main/java/org/eclipse/yasson/internal/serializer/AdaptedObjectSerializer.java b/src/main/java/org/eclipse/yasson/internal/serializer/AdaptedObjectSerializer.java
index 96ce82a..17ee746 100644
--- a/src/main/java/org/eclipse/yasson/internal/serializer/AdaptedObjectSerializer.java
+++ b/src/main/java/org/eclipse/yasson/internal/serializer/AdaptedObjectSerializer.java
@@ -59,6 +59,10 @@
if (context.addProcessedObject(obj)) {
final JsonbAdapter<T, A> adapter = (JsonbAdapter<T, A>) adapterInfo.getAdapter();
A adapted = adapter.adaptToJson(obj);
+ if (adapted == null) {
+ generator.writeNull();
+ return;
+ }
final JsonbSerializer<A> serializer = resolveSerializer((Marshaller) ctx, adapted);
serializer.serialize(adapted, generator, ctx);
} else {
diff --git a/src/test/java/org/eclipse/yasson/adapters/AdaptersTest.java b/src/test/java/org/eclipse/yasson/adapters/AdaptersTest.java
index 41b763c..17676ad 100644
--- a/src/test/java/org/eclipse/yasson/adapters/AdaptersTest.java
+++ b/src/test/java/org/eclipse/yasson/adapters/AdaptersTest.java
@@ -24,8 +24,10 @@
import org.eclipse.yasson.adapters.model.GenericBox;
import org.eclipse.yasson.adapters.model.IntegerListToStringAdapter;
import org.eclipse.yasson.adapters.model.JsonObjectPojo;
+import org.eclipse.yasson.adapters.model.ReturnNullAdapter;
import org.eclipse.yasson.adapters.model.SupertypeAdapterPojo;
import org.eclipse.yasson.adapters.model.UUIDContainer;
+import org.eclipse.yasson.defaultmapping.generics.model.ScalarValueWrapper;
import org.junit.Assert;
import org.junit.Test;
@@ -33,6 +35,7 @@
import javax.json.bind.JsonbBuilder;
import javax.json.bind.JsonbConfig;
import javax.json.bind.adapter.JsonbAdapter;
+import java.lang.reflect.Type;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Arrays;
@@ -437,6 +440,22 @@
}
@Test
+ public void testAdapterReturningNull() {
+ Jsonb jsonb = JsonbBuilder.create(new JsonbConfig().withAdapters(new ReturnNullAdapter()).withNullValues(true));
+
+ ScalarValueWrapper<Number> wrapper = new ScalarValueWrapper<>();
+ wrapper.setValue(10);
+ Type type = new TestTypeToken<ScalarValueWrapper<Number>>() {
+ }.getType();
+ String json = jsonb.toJson(wrapper, type);
+
+ Assert.assertEquals("{\"value\":null}", json);
+
+ ScalarValueWrapper<Number> result = jsonb.fromJson("{\"value\":null}", type);
+ Assert.assertNull(result.getValue());
+ }
+
+ @Test
public void testAdaptUUID() {
jsonb = JsonbBuilder.create();
UUIDContainer pojo = new UUIDContainer();
diff --git a/src/test/java/org/eclipse/yasson/adapters/model/ReturnNullAdapter.java b/src/test/java/org/eclipse/yasson/adapters/model/ReturnNullAdapter.java
new file mode 100644
index 0000000..60e9056
--- /dev/null
+++ b/src/test/java/org/eclipse/yasson/adapters/model/ReturnNullAdapter.java
@@ -0,0 +1,24 @@
+/*******************************************************************************
+ * Copyright (c) 2018 Oracle and/or its affiliates. All rights reserved.
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 and Eclipse Distribution License v. 1.0
+ * which accompanies this distribution.
+ * The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html
+ * and the Eclipse Distribution License is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ ******************************************************************************/
+package org.eclipse.yasson.adapters.model;
+
+import javax.json.bind.adapter.JsonbAdapter;
+
+public class ReturnNullAdapter implements JsonbAdapter<Number, String> {
+ @Override
+ public String adaptToJson(Number obj) throws Exception {
+ return null;
+ }
+
+ @Override
+ public Number adaptFromJson(String obj) throws Exception {
+ return null;
+ }
+}
diff --git a/src/test/java/org/eclipse/yasson/customization/JsonbNillableTest.java b/src/test/java/org/eclipse/yasson/customization/JsonbNillableTest.java
index c0b52b9..5e3c187 100644
--- a/src/test/java/org/eclipse/yasson/customization/JsonbNillableTest.java
+++ b/src/test/java/org/eclipse/yasson/customization/JsonbNillableTest.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2016, 2017 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2016, 2018 Oracle and/or its affiliates. All rights reserved.
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v1.0 and Eclipse Distribution License v. 1.0
* which accompanies this distribution.
@@ -13,7 +13,11 @@
package org.eclipse.yasson.customization;
-import org.eclipse.yasson.customization.model.*;
+import org.eclipse.yasson.customization.model.JsonbNillableClassSecondLevel;
+import org.eclipse.yasson.customization.model.JsonbNillableOverriddenWithJsonbProperty;
+import org.eclipse.yasson.customization.model.JsonbNillableOverridesClass;
+import org.eclipse.yasson.customization.model.JsonbNillableOverridesInterface;
+import org.eclipse.yasson.customization.model.JsonbNillableValue;
import org.eclipse.yasson.customization.model.packagelevelannotations.JsonbNillablePackageLevel;
import org.eclipse.yasson.customization.model.packagelevelannotations.PackageLevelOverriddenWithClassLevel;
import org.eclipse.yasson.defaultmapping.generics.model.ScalarValueWrapper;