Fixed [JACKSON-774]
diff --git a/release-notes/CREDITS b/release-notes/CREDITS index 6948c19..2abe00a 100644 --- a/release-notes/CREDITS +++ b/release-notes/CREDITS
@@ -855,6 +855,11 @@ of EnumMap, regular Map, or contents of EnumSet [1.9.4] +Nathaniel Bauernfeind: + * Reported [JACKSON-774]: PropertyBasedCreator not using JsonDeserializer.getNullValue() + [1.9.5] + Ittai Zeidman: * Reported [JACKSON-775]: MissingNode.asText() should return "", not null [1.9.5] + \ No newline at end of file
diff --git a/release-notes/VERSION b/release-notes/VERSION index b5eb9c8..7720980 100644 --- a/release-notes/VERSION +++ b/release-notes/VERSION
@@ -11,6 +11,8 @@ * [JACKSON-757]: further fixing (1.9.4 had partial fix) * [JACKSON-773]: Bug in SimpleFilterProvider constructor (reported by Kenny M) + * [JACKSON-774]: PropertyBasedCreator was not using JsonDeserializer.getNullValue() + (reported by Nathaniel B) * [JACKSON-775]: MissingNode.asText() should return "", not null (reported by Ittai Z)
diff --git a/src/mapper/java/org/codehaus/jackson/map/deser/impl/PropertyBasedCreator.java b/src/mapper/java/org/codehaus/jackson/map/deser/impl/PropertyBasedCreator.java index 8da1777..fbf59cb 100644 --- a/src/mapper/java/org/codehaus/jackson/map/deser/impl/PropertyBasedCreator.java +++ b/src/mapper/java/org/codehaus/jackson/map/deser/impl/PropertyBasedCreator.java
@@ -34,7 +34,7 @@ * If some property values must always have a non-null value (like * primitive types do), this array contains such default values. */ - protected final Object[] _defaultValues; + protected Object[] _defaultValues; /** * Array that contains properties that expect value to inject, if any; @@ -84,6 +84,13 @@ public void assignDeserializer(SettableBeanProperty prop, JsonDeserializer<Object> deser) { prop = prop.withValueDeserializer(deser); _properties.put(prop.getName(), prop); + Object nullValue = deser.getNullValue(); + if (nullValue != null) { + if (_defaultValues == null) { + _defaultValues = new Object[_properties.size()]; + } + _defaultValues[prop.getPropertyIndex()] = nullValue; + } } /**
diff --git a/src/test/org/codehaus/jackson/map/deser/TestCreatorNullValue.java b/src/test/org/codehaus/jackson/map/deser/TestCreatorNullValue.java new file mode 100644 index 0000000..8239e41 --- /dev/null +++ b/src/test/org/codehaus/jackson/map/deser/TestCreatorNullValue.java
@@ -0,0 +1,82 @@ +package org.codehaus.jackson.map.deser; + +import org.codehaus.jackson.*; +import org.codehaus.jackson.annotate.*; +import org.codehaus.jackson.map.*; +import org.codehaus.jackson.type.JavaType; + +// for [JACKSON-774] +@SuppressWarnings("rawtypes") +public class TestCreatorNullValue extends BaseMapTest +{ + private static class Container { + Contained<String> contained; + + @SuppressWarnings("unused") + @JsonCreator + public Container(@JsonProperty("contained") Contained<String> contained) { + this.contained = contained; + } + } + + private static interface Contained<T> {} + + private static class NullContained implements Contained<Object> {} + + private static final NullContained NULL_CONTAINED = new NullContained(); + + private static class ContainedDeserializer extends JsonDeserializer<Contained> { + @Override + public Contained deserialize(JsonParser jp, DeserializationContext ctxt) throws JsonProcessingException { + return null; + } + + @Override + public Contained getNullValue() { + return NULL_CONTAINED; + } + } + + private static class ContainerDeserializerResolver extends Deserializers.Base { + @Override + public JsonDeserializer<?> findBeanDeserializer(JavaType type, + DeserializationConfig config, DeserializerProvider provider, BeanDescription beanDesc, BeanProperty property) + throws JsonMappingException { + if (!Contained.class.isAssignableFrom(type.getRawClass())) { + return null; + } else { + return new ContainedDeserializer(); + } + } + } + + private static class TestModule extends Module { + @Override + public String getModuleName() { + return "ContainedModule"; + } + + @Override + public Version version() { + return Version.unknownVersion(); + } + + @Override + public void setupModule(SetupContext setupContext) { + setupContext.addDeserializers(new ContainerDeserializerResolver()); + } + } + + /* + /********************************************************** + /* Unit tests + /********************************************************** + */ + + public void testUsesDeserializersNullValue() throws Exception { + ObjectMapper mapper = new ObjectMapper(); + mapper.registerModule(new TestModule()); + Container container = mapper.readValue("{}", Container.class); + assertEquals(NULL_CONTAINED, container.contained); + } +} \ No newline at end of file