Fix [JACKSON-834]; add unit test for [JACKSON-831]
diff --git a/src/mapper/java/org/codehaus/jackson/map/deser/impl/ExternalTypeHandler.java b/src/mapper/java/org/codehaus/jackson/map/deser/impl/ExternalTypeHandler.java index 5a51510..38b7df1 100644 --- a/src/mapper/java/org/codehaus/jackson/map/deser/impl/ExternalTypeHandler.java +++ b/src/mapper/java/org/codehaus/jackson/map/deser/impl/ExternalTypeHandler.java
@@ -95,7 +95,7 @@ continue; } // but not just one - throw ctxt.mappingException("Missing external type id property '"+_properties[i].getTypePropertyName()); + throw ctxt.mappingException("Missing external type id property '"+_properties[i].getTypePropertyName()+"'"); } else if (_tokens[i] == null) { SettableBeanProperty prop = _properties[i].getProperty(); throw ctxt.mappingException("Missing property '"+prop.getName()+"' for external type id '"+_properties[i].getTypePropertyName());
diff --git a/src/mapper/java/org/codehaus/jackson/map/deser/std/EnumDeserializer.java b/src/mapper/java/org/codehaus/jackson/map/deser/std/EnumDeserializer.java index 0625ed5..fdd6226 100644 --- a/src/mapper/java/org/codehaus/jackson/map/deser/std/EnumDeserializer.java +++ b/src/mapper/java/org/codehaus/jackson/map/deser/std/EnumDeserializer.java
@@ -38,8 +38,6 @@ * * @return Deserializer based on given factory method, if type was suitable; * null if type can not be used - * - * @since 1.6 */ public static JsonDeserializer<?> deserializerForCreator(DeserializationConfig config, Class<?> enumClass, AnnotatedMethod factory)
diff --git a/src/test/org/codehaus/jackson/map/jsontype/TestExternalId.java b/src/test/org/codehaus/jackson/map/jsontype/TestExternalId.java index 411bce3..efbefa7 100644 --- a/src/test/org/codehaus/jackson/map/jsontype/TestExternalId.java +++ b/src/test/org/codehaus/jackson/map/jsontype/TestExternalId.java
@@ -2,6 +2,7 @@ import org.codehaus.jackson.annotate.JsonCreator; import org.codehaus.jackson.annotate.JsonProperty; +import org.codehaus.jackson.annotate.JsonSubTypes; import org.codehaus.jackson.annotate.JsonTypeInfo; import org.codehaus.jackson.annotate.JsonTypeInfo.As; import org.codehaus.jackson.annotate.JsonTypeInfo.Id; @@ -80,6 +81,30 @@ public int i = 3; } + // [JACKSON-831] + + interface Pet {} + + static class Dog implements Pet { + public String name; + } + + static class House831 { + private String petType; + + @JsonTypeInfo(use = Id.NAME, include = As.EXTERNAL_PROPERTY, property = "petType") + @JsonSubTypes({@JsonSubTypes.Type(name = "dog", value = Dog.class)}) + public Pet pet; + + public String getPetType() { + return petType; + } + + public void setPetType(String petType) { + this.petType = petType; + } + } + /* /********************************************************** /* Unit tests, serialization @@ -168,4 +193,16 @@ assertNotNull(result); assertEquals(3, result.i); } + + // There seems to be some problems if type is also visible... + public void testIssue831() throws Exception + { + final String JSON = "{ \"petType\": \"dog\",\n" + +"\"pet\": { \"name\": \"Pluto\" }\n}"; + ObjectMapper mapper = new ObjectMapper(); + House831 result = mapper.readValue(JSON, House831.class); + assertNotNull(result); + assertNotNull(result.pet); + assertSame(Dog.class, result.pet.getClass()); + } }