From 0ffbca84ed9b068cb2e218b090baed84813ed925 Mon Sep 17 00:00:00 2001 From: Ben Fagin Date: Fri, 13 Dec 2013 19:27:55 -0800 Subject: [PATCH] Support type modifiers in type id name resolution. --- .../jsontype/impl/TypeNameIdResolver.java | 2 +- .../TestTypeModifierNameResolution.java | 58 +++++++++++++++++++ 2 files changed, 59 insertions(+), 1 deletion(-) create mode 100644 src/test/java/com/fasterxml/jackson/databind/module/TestTypeModifierNameResolution.java diff --git a/src/main/java/com/fasterxml/jackson/databind/jsontype/impl/TypeNameIdResolver.java b/src/main/java/com/fasterxml/jackson/databind/jsontype/impl/TypeNameIdResolver.java index 7028b6b98b..11237a6407 100644 --- a/src/main/java/com/fasterxml/jackson/databind/jsontype/impl/TypeNameIdResolver.java +++ b/src/main/java/com/fasterxml/jackson/databind/jsontype/impl/TypeNameIdResolver.java @@ -82,7 +82,7 @@ public static TypeNameIdResolver construct(MapperConfig config, @Override public String idFromValue(Object value) { - Class cls = value.getClass(); + Class cls = _typeFactory.constructType(value.getClass()).getRawClass(); final String key = cls.getName(); String name; synchronized (_typeToId) { diff --git a/src/test/java/com/fasterxml/jackson/databind/module/TestTypeModifierNameResolution.java b/src/test/java/com/fasterxml/jackson/databind/module/TestTypeModifierNameResolution.java new file mode 100644 index 0000000000..4ef25a507d --- /dev/null +++ b/src/test/java/com/fasterxml/jackson/databind/module/TestTypeModifierNameResolution.java @@ -0,0 +1,58 @@ +package com.fasterxml.jackson.databind.module; + +import com.fasterxml.jackson.annotation.JsonTypeInfo; +import com.fasterxml.jackson.databind.JavaType; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.type.TypeBindings; +import com.fasterxml.jackson.databind.type.TypeFactory; +import com.fasterxml.jackson.databind.type.TypeModifier; +import com.fasterxml.jackson.test.BaseTest; + +import java.lang.reflect.Type; + +public class TestTypeModifierNameResolution extends BaseTest { + + interface MyType { + String getData(); + void setData(String data); + } + + static class MyTypeImpl implements MyType { + private String data; + + public String getData() { + return data; + } + + public void setData(String data) { + this.data = data; + } + } + + static class CustomTypeModifier extends TypeModifier { + @Override + public JavaType modifyType(JavaType type, Type jdkType, TypeBindings context, TypeFactory typeFactory) { + if (type.getRawClass().equals(MyTypeImpl.class)) { + return typeFactory.constructType(MyType.class); + } + return type; + } + } + + @JsonTypeInfo(use=JsonTypeInfo.Id.NAME, include=JsonTypeInfo.As.WRAPPER_OBJECT) + public interface Mixin { } + + // Expect that the TypeModifier kicks in when the type id is written. + public void testTypeModiferNameResolution() throws Exception + { + ObjectMapper mapper = new ObjectMapper(); + mapper.setTypeFactory(mapper.getTypeFactory().withModifier(new CustomTypeModifier())); + mapper.addMixInAnnotations(MyType.class, Mixin.class); + + MyType obj = new MyTypeImpl(); + obj.setData("something"); + + String s = mapper.writer().writeValueAsString(obj); + assertTrue(s.startsWith("{\"TestTypeModifierNameResolution$MyType\":")); + } +} \ No newline at end of file