package com.fasterxml.jackson.databind.mixins; import java.io.*; import com.fasterxml.jackson.annotation.*; import com.fasterxml.jackson.databind.*; public class TestMixinDeserForCreators extends BaseMapTest { /* /********************************************************** /* Helper bean classes /********************************************************** */ static class BaseClass { protected String _a; public BaseClass(String a) { _a = a+"..."; } private BaseClass(String value, boolean dummy) { _a = value; } public static BaseClass myFactory(String a) { return new BaseClass(a+"X", true); } } static class BaseClassWithPrivateCtor { protected String _a; private BaseClassWithPrivateCtor(String a) { _a = a+"..."; } } /** * Mix-in class that will effectively suppresses String constructor, * and marks a non-auto-detectable static method as factory method * as a creator. *<p> * Note that method implementations are not used for anything; but * we have to a class: interface won't do, as they can't have * constructors or static methods. */ static class MixIn { @JsonIgnore protected MixIn(String s) { } @JsonCreator static BaseClass myFactory(String a) { return null; } } static class MixInForPrivate { @JsonCreator MixInForPrivate(String s) { } } static class StringWrapper { String _value; private StringWrapper(String s, boolean foo) { _value = s; } @SuppressWarnings("unused") private static StringWrapper create(String str) { return new StringWrapper(str, false); } } abstract static class StringWrapperMixIn { @JsonCreator static StringWrapper create(String str) { return null; } } /* /********************************************************** /* Unit tests /********************************************************** */ public void testForConstructor() throws IOException { ObjectMapper m = new ObjectMapper(); m.addMixIn(BaseClassWithPrivateCtor.class, MixInForPrivate.class); BaseClassWithPrivateCtor result = m.readValue("\"?\"", BaseClassWithPrivateCtor.class); assertEquals("?...", result._a); } public void testForFactoryAndCtor() throws IOException { ObjectMapper m = new ObjectMapper(); BaseClass result; // First: test default behavior: should use constructor result = m.readValue("\"string\"", BaseClass.class); assertEquals("string...", result._a); // Then with simple mix-in: should change to use the factory method m = new ObjectMapper(); m.addMixIn(BaseClass.class, MixIn.class); result = m.readValue("\"string\"", BaseClass.class); assertEquals("stringX", result._a); } public void testFactoryMixIn() throws IOException { ObjectMapper m = new ObjectMapper(); m.addMixIn(StringWrapper.class, StringWrapperMixIn.class); StringWrapper result = m.readValue("\"a\"", StringWrapper.class); assertEquals("a", result._value); } }