package com.fasterxml.jackson.databind.creators; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.databind.*; /** * Tests to ensure that deserialization fails when a bean property has a null value * Relates to <a href="https://github.com/FasterXML/jackson-databind/issues/988">issue #988</a> */ public class FailOnNullCreatorTest extends BaseMapTest { static class Person { String name; Integer age; @JsonCreator public Person(@JsonProperty(value="name") String name, @JsonProperty(value="age") int age) { this.name = name; this.age = age; } } private final ObjectReader POINT_READER = objectMapper().readerFor(Person.class); public void testRequiredNonNullParam() throws Exception { Person p; // First: fine if feature is not enabled p = POINT_READER.readValue(aposToQuotes("{}")); assertEquals(null, p.name); assertEquals(Integer.valueOf(0), p.age); // Second: fine if feature is enabled but default value is not null ObjectReader r = POINT_READER.with(DeserializationFeature.FAIL_ON_NULL_CREATOR_PROPERTIES); p = POINT_READER.readValue(aposToQuotes("{'name':'John', 'age': null}")); assertEquals("John", p.name); assertEquals(Integer.valueOf(0), p.age); // Third: throws exception if property is missing try { r.readValue(aposToQuotes("{}")); fail("Should not pass third test"); } catch (JsonMappingException e) { verifyException(e, "Null value for creator property 'name'"); } // Fourth: throws exception if property is set to null explicitly try { r.readValue(aposToQuotes("{'age': 5, 'name': null}")); fail("Should not pass fourth test"); } catch (JsonMappingException e) { verifyException(e, "Null value for creator property 'name'"); } } }