Skip to content

Commit

Permalink
Null in Optional type fields should not fail (#576)
Browse files Browse the repository at this point in the history
Signed-off-by: David Kral <[email protected]>
  • Loading branch information
Verdent authored Aug 31, 2022
1 parent 325cf97 commit 9d6aad9
Show file tree
Hide file tree
Showing 6 changed files with 72 additions and 5 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ class OptionalSerializer implements ModelSerializer {
@Override
public void serialize(Object value, JsonGenerator generator, SerializationContextImpl context) {
Optional<Object> optional = (Optional<Object>) value;
delegate.serialize(optional.orElse(null), generator, context);
delegate.serialize(optional == null ? null : optional.orElse(null), generator, context);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ class OptionalDoubleSerializer implements ModelSerializer {
@Override
public void serialize(Object value, JsonGenerator generator, SerializationContextImpl context) {
OptionalDouble optionalDouble = (OptionalDouble) value;
if (optionalDouble.isPresent()) {
if (optionalDouble != null && optionalDouble.isPresent()) {
typeSerializer.serialize(optionalDouble.getAsDouble(), generator, context);
} else {
typeSerializer.serialize(null, generator, context);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ class OptionalIntSerializer implements ModelSerializer {
@Override
public void serialize(Object value, JsonGenerator generator, SerializationContextImpl context) {
OptionalInt optionalInt = (OptionalInt) value;
if (optionalInt.isPresent()) {
if (optionalInt != null && optionalInt.isPresent()) {
typeSerializer.serialize(optionalInt.getAsInt(), generator, context);
} else {
typeSerializer.serialize(null, generator, context);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ class OptionalLongSerializer implements ModelSerializer {
@Override
public void serialize(Object value, JsonGenerator generator, SerializationContextImpl context) {
OptionalLong optionalLong = (OptionalLong) value;
if (optionalLong.isPresent()) {
if (optionalLong != null && optionalLong.isPresent()) {
typeSerializer.serialize(optionalLong.getAsLong(), generator, context);
} else {
typeSerializer.serialize(null, generator, context);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright (c) 2015, 2020 Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2015, 2022 Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2019, 2020 Payara Foundation and/or its affiliates. All rights reserved.
*
* This program and the accompanying materials are made available under the
Expand All @@ -13,7 +13,11 @@

package org.eclipse.yasson.defaultmapping.specific;

import org.eclipse.yasson.defaultmapping.specific.model.SpecificOptionalWrapper;
import org.junit.jupiter.api.*;

import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.junit.jupiter.api.Assertions.*;
import static org.eclipse.yasson.Jsonbs.*;

Expand Down Expand Up @@ -189,6 +193,20 @@ public void testUnmarshalEmptyDouble() {
assertEquals(OptionalDouble.empty(), bindingJsonb.fromJson("null", OptionalDouble.class));
}

@Test
public void testNullInsteadOfOptional() {
OptionalWrapper optionalWrapper = new OptionalWrapper();
String expected = "{}";
assertThat(bindingJsonb.toJson(optionalWrapper), is(expected));
}

@Test
public void testNullInsteadOfOptionalInSpecificOptionals() {
SpecificOptionalWrapper optionalWrapper = new SpecificOptionalWrapper();
String expected = "{}";
assertThat(bindingJsonb.toJson(optionalWrapper), is(expected));
}

public static class Customer {
private int id;
private String name;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
/*
* Copyright (c) 2022 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 v. 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0,
* or the Eclipse Distribution License v. 1.0 which is available at
* http://www.eclipse.org/org/documents/edl-v10.php.
*
* SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
*/

package org.eclipse.yasson.defaultmapping.specific.model;

import java.util.OptionalDouble;
import java.util.OptionalInt;
import java.util.OptionalLong;

public class SpecificOptionalWrapper {

private OptionalInt optionalInt;
private OptionalLong optionalLong;
private OptionalDouble optionalDouble;

public OptionalInt optionalInt() {
return optionalInt;
}

public void setOptionalInt(OptionalInt optionalInt) {
this.optionalInt = optionalInt;
}

public OptionalLong optionalLong() {
return optionalLong;
}

public void setOptionalLong(OptionalLong optionalLong) {
this.optionalLong = optionalLong;
}

public OptionalDouble optionalDouble() {
return optionalDouble;
}

public void setOptionalDouble(OptionalDouble optionalDouble) {
this.optionalDouble = optionalDouble;
}

}

0 comments on commit 9d6aad9

Please sign in to comment.