Skip to content

Commit 9d6aad9

Browse files
authored
Null in Optional type fields should not fail (#576)
Signed-off-by: David Kral <[email protected]>
1 parent 325cf97 commit 9d6aad9

File tree

6 files changed

+72
-5
lines changed

6 files changed

+72
-5
lines changed

src/main/java/org/eclipse/yasson/internal/serializer/OptionalSerializer.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ class OptionalSerializer implements ModelSerializer {
3333
@Override
3434
public void serialize(Object value, JsonGenerator generator, SerializationContextImpl context) {
3535
Optional<Object> optional = (Optional<Object>) value;
36-
delegate.serialize(optional.orElse(null), generator, context);
36+
delegate.serialize(optional == null ? null : optional.orElse(null), generator, context);
3737
}
3838

3939
}

src/main/java/org/eclipse/yasson/internal/serializer/types/OptionalDoubleSerializer.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ class OptionalDoubleSerializer implements ModelSerializer {
3333
@Override
3434
public void serialize(Object value, JsonGenerator generator, SerializationContextImpl context) {
3535
OptionalDouble optionalDouble = (OptionalDouble) value;
36-
if (optionalDouble.isPresent()) {
36+
if (optionalDouble != null && optionalDouble.isPresent()) {
3737
typeSerializer.serialize(optionalDouble.getAsDouble(), generator, context);
3838
} else {
3939
typeSerializer.serialize(null, generator, context);

src/main/java/org/eclipse/yasson/internal/serializer/types/OptionalIntSerializer.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ class OptionalIntSerializer implements ModelSerializer {
3333
@Override
3434
public void serialize(Object value, JsonGenerator generator, SerializationContextImpl context) {
3535
OptionalInt optionalInt = (OptionalInt) value;
36-
if (optionalInt.isPresent()) {
36+
if (optionalInt != null && optionalInt.isPresent()) {
3737
typeSerializer.serialize(optionalInt.getAsInt(), generator, context);
3838
} else {
3939
typeSerializer.serialize(null, generator, context);

src/main/java/org/eclipse/yasson/internal/serializer/types/OptionalLongSerializer.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ class OptionalLongSerializer implements ModelSerializer {
3333
@Override
3434
public void serialize(Object value, JsonGenerator generator, SerializationContextImpl context) {
3535
OptionalLong optionalLong = (OptionalLong) value;
36-
if (optionalLong.isPresent()) {
36+
if (optionalLong != null && optionalLong.isPresent()) {
3737
typeSerializer.serialize(optionalLong.getAsLong(), generator, context);
3838
} else {
3939
typeSerializer.serialize(null, generator, context);

src/test/java/org/eclipse/yasson/defaultmapping/specific/OptionalTest.java

+19-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2015, 2020 Oracle and/or its affiliates. All rights reserved.
2+
* Copyright (c) 2015, 2022 Oracle and/or its affiliates. All rights reserved.
33
* Copyright (c) 2019, 2020 Payara Foundation and/or its affiliates. All rights reserved.
44
*
55
* This program and the accompanying materials are made available under the
@@ -13,7 +13,11 @@
1313

1414
package org.eclipse.yasson.defaultmapping.specific;
1515

16+
import org.eclipse.yasson.defaultmapping.specific.model.SpecificOptionalWrapper;
1617
import org.junit.jupiter.api.*;
18+
19+
import static org.hamcrest.CoreMatchers.is;
20+
import static org.hamcrest.MatcherAssert.assertThat;
1721
import static org.junit.jupiter.api.Assertions.*;
1822
import static org.eclipse.yasson.Jsonbs.*;
1923

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

196+
@Test
197+
public void testNullInsteadOfOptional() {
198+
OptionalWrapper optionalWrapper = new OptionalWrapper();
199+
String expected = "{}";
200+
assertThat(bindingJsonb.toJson(optionalWrapper), is(expected));
201+
}
202+
203+
@Test
204+
public void testNullInsteadOfOptionalInSpecificOptionals() {
205+
SpecificOptionalWrapper optionalWrapper = new SpecificOptionalWrapper();
206+
String expected = "{}";
207+
assertThat(bindingJsonb.toJson(optionalWrapper), is(expected));
208+
}
209+
192210
public static class Customer {
193211
private int id;
194212
private String name;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
/*
2+
* Copyright (c) 2022 Oracle and/or its affiliates. All rights reserved.
3+
*
4+
* This program and the accompanying materials are made available under the
5+
* terms of the Eclipse Public License v. 2.0 which is available at
6+
* http://www.eclipse.org/legal/epl-2.0,
7+
* or the Eclipse Distribution License v. 1.0 which is available at
8+
* http://www.eclipse.org/org/documents/edl-v10.php.
9+
*
10+
* SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
11+
*/
12+
13+
package org.eclipse.yasson.defaultmapping.specific.model;
14+
15+
import java.util.OptionalDouble;
16+
import java.util.OptionalInt;
17+
import java.util.OptionalLong;
18+
19+
public class SpecificOptionalWrapper {
20+
21+
private OptionalInt optionalInt;
22+
private OptionalLong optionalLong;
23+
private OptionalDouble optionalDouble;
24+
25+
public OptionalInt optionalInt() {
26+
return optionalInt;
27+
}
28+
29+
public void setOptionalInt(OptionalInt optionalInt) {
30+
this.optionalInt = optionalInt;
31+
}
32+
33+
public OptionalLong optionalLong() {
34+
return optionalLong;
35+
}
36+
37+
public void setOptionalLong(OptionalLong optionalLong) {
38+
this.optionalLong = optionalLong;
39+
}
40+
41+
public OptionalDouble optionalDouble() {
42+
return optionalDouble;
43+
}
44+
45+
public void setOptionalDouble(OptionalDouble optionalDouble) {
46+
this.optionalDouble = optionalDouble;
47+
}
48+
49+
}

0 commit comments

Comments
 (0)