blob: f651c42e9b1c188b8b1b10997772ff12faf25de9 [file] [log] [blame]
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);
}
}