package com.fasterxml.jackson.databind.creators; import java.io.IOException; import java.util.UUID; import com.fasterxml.jackson.annotation.*; import com.fasterxml.jackson.core.*; import com.fasterxml.jackson.databind.*; import com.fasterxml.jackson.databind.deser.*; public class TestCreatorNullValue extends BaseMapTest { protected static class Container { Contained<String> contained; @JsonCreator public Container(@JsonProperty("contained") Contained<String> contained) { this.contained = contained; } } protected static interface Contained<T> {} protected static class NullContained implements Contained<Object> {} protected static final NullContained NULL_CONTAINED = new NullContained(); protected static class ContainedDeserializer extends JsonDeserializer<Contained<?>> { @Override public Contained<?> deserialize(JsonParser jp, DeserializationContext ctxt) throws JsonProcessingException { return null; } @Override public Contained<?> getNullValue(DeserializationContext ctxt) { return NULL_CONTAINED; } } protected static class ContainerDeserializerResolver extends Deserializers.Base { @Override public JsonDeserializer<?> findBeanDeserializer(JavaType type, DeserializationConfig config, BeanDescription beanDesc) throws JsonMappingException { if (!Contained.class.isAssignableFrom(type.getRawClass())) { return null; } return new ContainedDeserializer(); } } protected 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()); } } // [databind#597] static class JsonEntity { protected final String type; protected final UUID id; private JsonEntity(String type, UUID id) { this.type = type; this.id = id; } @JsonCreator public static JsonEntity create(@JsonProperty("type") String type, @JsonProperty("id") UUID id) { if (type != null && !type.contains(" ") && (id != null)) { return new JsonEntity(type, id); } return null; } } /* /********************************************************** /* 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); } // [databind#597]: ensure that a useful exception is thrown public void testCreatorReturningNull() throws IOException { ObjectMapper objectMapper = new ObjectMapper(); String json = "{ \"type\" : \" \", \"id\" : \"000c0ffb-a0d6-4d2e-a379-4aeaaf283599\" }"; try { objectMapper.readValue(json, JsonEntity.class); fail("Should not have succeeded"); } catch (JsonMappingException e) { verifyException(e, "JSON creator returned null"); } } }