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;