diff --git a/src/main/java/org/eclipse/yasson/internal/serializer/AbstractContainerDeserializer.java b/src/main/java/org/eclipse/yasson/internal/serializer/AbstractContainerDeserializer.java index 76bc87d1c..212e71130 100644 --- a/src/main/java/org/eclipse/yasson/internal/serializer/AbstractContainerDeserializer.java +++ b/src/main/java/org/eclipse/yasson/internal/serializer/AbstractContainerDeserializer.java @@ -22,6 +22,7 @@ import javax.json.bind.serializer.DeserializationContext; import javax.json.bind.serializer.JsonbDeserializer; import javax.json.stream.JsonParser; +import java.lang.reflect.Array; import java.lang.reflect.Type; import java.util.Optional; import java.util.OptionalDouble; @@ -157,6 +158,8 @@ protected Object convertNullToOptionalEmpty(Type propertyType, Object value) { return OptionalLong.empty(); } else if (propertyType == OptionalDouble.class) { return OptionalDouble.empty(); + } else if (((Class) propertyType).isPrimitive()){ + return Array.get(Array.newInstance((Class) propertyType, 1), 0); } else { return null; } 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 803ad2861..466a6ba51 100644 --- a/src/main/java/org/eclipse/yasson/internal/serializer/ObjectDeserializer.java +++ b/src/main/java/org/eclipse/yasson/internal/serializer/ObjectDeserializer.java @@ -114,11 +114,7 @@ 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())); - } - paramValues.add(valueWrapper.getValue()); + paramValues.add(valueWrapper == null ? convertNullToOptionalEmpty(param.getType(), null) : 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..d30d79671 100644 --- a/src/test/java/org/eclipse/yasson/customization/JsonbCreatorTest.java +++ b/src/test/java/org/eclipse/yasson/customization/JsonbCreatorTest.java @@ -35,6 +35,8 @@ */ public class JsonbCreatorTest { + private static byte DEFAULT_BYTE; + @Test public void testRootConstructor() { String json = "{\"str1\":\"abc\",\"str2\":\"def\",\"bigDec\":25}"; @@ -42,6 +44,7 @@ public void testRootConstructor() { CreatorConstructorPojo pojo = jsonb.fromJson(json, CreatorConstructorPojo.class); assertEquals("abc", pojo.str1); assertEquals("def", pojo.str2); + assertNull(pojo.missing); assertEquals(new BigDecimal("25"), pojo.bigDec); } @@ -52,6 +55,7 @@ public void testRootFactoryMethod() { CreatorFactoryMethodPojo pojo = jsonb.fromJson(json, CreatorFactoryMethodPojo.class); assertEquals("abc", pojo.str1); assertEquals("def", pojo.str2); + assertNull(pojo.missing); assertEquals(new BigDecimal("25"), pojo.bigDec); } @@ -62,10 +66,12 @@ public void testRootCreatorWithInnerCreator() { CreatorConstructorPojo pojo = jsonb.fromJson(json, CreatorConstructorPojo.class); assertEquals("abc", pojo.str1); assertEquals("def", pojo.str2); + assertNull(pojo.missing); assertEquals(new BigDecimal("25"), pojo.bigDec); assertEquals("inn1", pojo.innerFactoryCreator.str1); assertEquals("inn2", pojo.innerFactoryCreator.str2); + assertNull(pojo.innerFactoryCreator.missing); assertEquals(new BigDecimal("11"), pojo.innerFactoryCreator.bigDec); } @@ -89,10 +95,13 @@ public void testMultipleCreatorsError() { } } - @Test(expected = JsonbException.class) + @Test public void testCreatorWithoutJsonbParameters1() { //arg2 is missing in json document - JsonbBuilder.create().fromJson("{\"arg0\":\"abc\", \"s2\":\"def\"}", CreatorWithoutJsonbProperty1.class); + final CreatorWithoutJsonbProperty1 result = JsonbBuilder.create().fromJson("{\"arg0\":\"abc\", \"s2\":\"def\"}", CreatorWithoutJsonbProperty1.class); + assertEquals("abc", result.getPar1()); + assertEquals("def", result.getPar2()); + assertEquals(DEFAULT_BYTE, result.getPar3()); } @Test diff --git a/src/test/java/org/eclipse/yasson/customization/model/CreatorConstructorPojo.java b/src/test/java/org/eclipse/yasson/customization/model/CreatorConstructorPojo.java index 6d19c1996..d9e176e72 100644 --- a/src/test/java/org/eclipse/yasson/customization/model/CreatorConstructorPojo.java +++ b/src/test/java/org/eclipse/yasson/customization/model/CreatorConstructorPojo.java @@ -26,14 +26,17 @@ public class CreatorConstructorPojo { public String str2; + public String missing; + public BigDecimal bigDec; public CreatorFactoryMethodPojo innerFactoryCreator; @JsonbCreator - public CreatorConstructorPojo(@JsonbProperty("str1") String str1, @JsonbProperty("str2") String str2) { + public CreatorConstructorPojo(@JsonbProperty("str1") String str1, @JsonbProperty("str2") String str2, @JsonbProperty("missing") String missing) { this.str1 = str1; this.str2 = str2; + this.missing = missing; } } diff --git a/src/test/java/org/eclipse/yasson/customization/model/CreatorFactoryMethodPojo.java b/src/test/java/org/eclipse/yasson/customization/model/CreatorFactoryMethodPojo.java index 114d175fd..f2bd7d598 100644 --- a/src/test/java/org/eclipse/yasson/customization/model/CreatorFactoryMethodPojo.java +++ b/src/test/java/org/eclipse/yasson/customization/model/CreatorFactoryMethodPojo.java @@ -26,14 +26,17 @@ public class CreatorFactoryMethodPojo { public final String str2; + public final String missing; + public BigDecimal bigDec; - private CreatorFactoryMethodPojo(String str1, String str2) { + private CreatorFactoryMethodPojo(String str1, String str2, String missing) { this.str1 = str1; this.str2 = str2; + this.missing = missing; } @JsonbCreator - public static CreatorFactoryMethodPojo getInstance(@JsonbProperty("par1") String str1, @JsonbProperty("par2")String str2) { - return new CreatorFactoryMethodPojo(str1, str2); + public static CreatorFactoryMethodPojo getInstance(@JsonbProperty("par1") String str1, @JsonbProperty("par2")String str2, @JsonbProperty("missing") String missing) { + return new CreatorFactoryMethodPojo(str1, str2, missing); } }