| package com.fasterxml.jackson.databind.jsontype; |
| |
| import java.util.*; |
| |
| import com.fasterxml.jackson.annotation.*; |
| import com.fasterxml.jackson.databind.BaseMapTest; |
| import com.fasterxml.jackson.databind.DeserializationFeature; |
| import com.fasterxml.jackson.databind.ObjectMapper; |
| import com.fasterxml.jackson.databind.annotation.NoClass; |
| |
| /** |
| * Unit tests related to [JACKSON-712]; specialized handling of |
| * otherwise invalid type id embedding cases. |
| */ |
| public class TestTypedDeserializationWithDefault extends BaseMapTest |
| { |
| @JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "type", defaultImpl = LegacyInter.class) |
| @JsonSubTypes(value = {@JsonSubTypes.Type(name = "mine", value = MyInter.class)}) |
| public static interface Inter { } |
| |
| public static class MyInter implements Inter { |
| @JsonProperty("blah") public List<String> blah; |
| } |
| |
| public static class LegacyInter extends MyInter |
| { |
| @JsonCreator |
| LegacyInter(Object obj) |
| { |
| if (obj instanceof List) { |
| blah = new ArrayList<String>(); |
| for (Object o : (List<?>) obj) { |
| blah.add(o.toString()); |
| } |
| } |
| else if (obj instanceof String) { |
| blah = Arrays.asList(((String) obj).split(",")); |
| } |
| else { |
| throw new IllegalArgumentException("Unknown type: " + obj.getClass()); |
| } |
| } |
| } |
| |
| @JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "type", |
| defaultImpl = NoClass.class) |
| public static class DefaultWithNoClass { } |
| |
| // and then one with no defaultImpl nor listed subtypes |
| @JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "type") |
| abstract static class MysteryPolymorphic { } |
| |
| /* |
| /********************************************************** |
| /* Unit tests, deserialization |
| /********************************************************** |
| */ |
| |
| public void testDeserializationWithObject() throws Exception |
| { |
| Inter inter = objectReader(Inter.class).readValue("{\"type\": \"mine\", \"blah\": [\"a\", \"b\", \"c\"]}"); |
| assertTrue(inter instanceof MyInter); |
| assertFalse(inter instanceof LegacyInter); |
| assertEquals(Arrays.asList("a", "b", "c"), ((MyInter) inter).blah); |
| } |
| |
| public void testDeserializationWithString() throws Exception |
| { |
| Inter inter = objectReader(Inter.class).readValue("\"a,b,c,d\""); |
| assertTrue(inter instanceof LegacyInter); |
| assertEquals(Arrays.asList("a", "b", "c", "d"), ((MyInter) inter).blah); |
| } |
| |
| public void testDeserializationWithArray() throws Exception |
| { |
| Inter inter = objectReader(Inter.class).readValue("[\"a\", \"b\", \"c\", \"d\"]"); |
| assertTrue(inter instanceof LegacyInter); |
| assertEquals(Arrays.asList("a", "b", "c", "d"), ((MyInter) inter).blah); |
| } |
| |
| public void testDeserializationWithArrayOfSize2() throws Exception |
| { |
| Inter inter = objectReader(Inter.class).readValue("[\"a\", \"b\"]"); |
| assertTrue(inter instanceof LegacyInter); |
| assertEquals(Arrays.asList("a", "b"), ((MyInter) inter).blah); |
| } |
| |
| // [Issue#148] |
| public void testDefaultAsNoClass() throws Exception |
| { |
| Object ob = objectReader(DefaultWithNoClass.class).readValue("{ }"); |
| assertNull(ob); |
| ob = objectReader(DefaultWithNoClass.class).readValue("{ \"bogus\":3 }"); |
| assertNull(ob); |
| } |
| |
| // [Issue#148] |
| public void testBadTypeAsNull() throws Exception |
| { |
| ObjectMapper mapper = new ObjectMapper(); |
| mapper.disable(DeserializationFeature.FAIL_ON_INVALID_SUBTYPE); |
| Object ob = mapper.readValue("{}", MysteryPolymorphic.class); |
| assertNull(ob); |
| ob = mapper.readValue("{ \"whatever\":13}", MysteryPolymorphic.class); |
| assertNull(ob); |
| } |
| } |