diff --git a/src/main/java/org/eclipse/yasson/internal/serializer/ObjectDeserializer.java b/src/main/java/org/eclipse/yasson/internal/serializer/ObjectDeserializer.java index f1a603ef0..469cb5a2f 100644 --- a/src/main/java/org/eclipse/yasson/internal/serializer/ObjectDeserializer.java +++ b/src/main/java/org/eclipse/yasson/internal/serializer/ObjectDeserializer.java @@ -28,6 +28,7 @@ import java.util.LinkedHashMap; import java.util.List; import java.util.Map; +import java.util.Optional; import java.util.logging.Logger; /** @@ -115,11 +116,16 @@ private T createInstance(Class rawType, JsonbCreator creator) { final List paramValues = new ArrayList<>(); for(CreatorModel param : creator.getParams()) { final ValueWrapper valueWrapper = values.get(param.getName()); - //required by spec - if (valueWrapper == null){ - throw new JsonbException(Messages.getMessage(MessageKeys.JSONB_CREATOR_MISSING_PROPERTY, param.getName())); + if ( valueWrapper == null ) { + if (ReflectionUtils.getRawType(param.getType()).isAssignableFrom( Optional.class )) { + paramValues.add( Optional.empty() ); + } else { + //required by spec + throw new JsonbException( Messages.getMessage( MessageKeys.JSONB_CREATOR_MISSING_PROPERTY, param.getName() ) ); + } + } else { + paramValues.add( valueWrapper.getValue() ); } - paramValues.add(valueWrapper.getValue()); } instance = creator.call(paramValues.toArray(), rawType); return instance; diff --git a/src/test/java/org/eclipse/yasson/customization/JsonbCreatorTest.java b/src/test/java/org/eclipse/yasson/customization/JsonbCreatorTest.java index 63e34823c..0641dc659 100644 --- a/src/test/java/org/eclipse/yasson/customization/JsonbCreatorTest.java +++ b/src/test/java/org/eclipse/yasson/customization/JsonbCreatorTest.java @@ -45,6 +45,16 @@ public void testRootConstructor() { assertEquals(new BigDecimal("25"), pojo.bigDec); } + @Test + public void testRootConstructorOptional() { + String json = "{\"str1\":\"abc\",\"bigDec\":25}"; + final Jsonb jsonb = JsonbBuilder.create(); + CreatorConstructorPojoOptional pojo = jsonb.fromJson(json, CreatorConstructorPojoOptional.class); + assertEquals("abc", pojo.str1); + assertEquals(false, pojo.str2.isPresent()); + assertEquals(new BigDecimal("25"), pojo.bigDec); + } + @Test public void testRootFactoryMethod() { String json = "{\"par1\":\"abc\",\"par2\":\"def\",\"bigDec\":25}"; diff --git a/src/test/java/org/eclipse/yasson/customization/model/CreatorConstructorPojoOptional.java b/src/test/java/org/eclipse/yasson/customization/model/CreatorConstructorPojoOptional.java new file mode 100644 index 000000000..7ae6e4118 --- /dev/null +++ b/src/test/java/org/eclipse/yasson/customization/model/CreatorConstructorPojoOptional.java @@ -0,0 +1,27 @@ +package org.eclipse.yasson.customization.model; + +import javax.json.bind.annotation.JsonbCreator; +import javax.json.bind.annotation.JsonbProperty; +import java.math.BigDecimal; +import java.util.Optional; + +/** + * @author misl + */ +public class CreatorConstructorPojoOptional { + + public String str1; + + public Optional str2; + + public BigDecimal bigDec; + + public CreatorFactoryMethodPojo innerFactoryCreator; + + @JsonbCreator + public CreatorConstructorPojoOptional( @JsonbProperty("str1") String str1, @JsonbProperty("str2") Optional str2) { + this.str1 = str1; + this.str2 = str2; + } + +}