package com.fasterxml.jackson.databind.creators; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.databind.*; // For [databind#1501], [databind#1502], [databind#1503]; mostly to // test that for non-static inner classes constructors are ignored // and no Creators should be processed (since they can not be made // to work in standard way anyway). public class InnerClassCreatorTest extends BaseMapTest { static class Something1501 { public InnerSomething1501 a; // important: must name the parameter (param names module, or explicit) @JsonCreator public Something1501(@JsonProperty("a") InnerSomething1501 a) { this.a = a; } public Something1501(boolean bogus) { a = new InnerSomething1501(); } class InnerSomething1501 { @JsonCreator public InnerSomething1501() { } } } static class Something1502 { @JsonProperty public InnerSomething1502 a; @JsonCreator public Something1502(InnerSomething1502 a) {} class InnerSomething1502 { @JsonCreator public InnerSomething1502() {} } } static class Outer1503 { public InnerClass1503 innerClass; class InnerClass1503 { public Generic<?> generic; public InnerClass1503(@JsonProperty("generic") Generic<?> generic) {} } static class Generic<T> { public int ignored; } } private final ObjectMapper MAPPER = new ObjectMapper(); { MAPPER.disable(SerializationFeature.FAIL_ON_EMPTY_BEANS); } // Used to trigger `ArrayIndexOutOfBoundsException` for missing creator property index public void testIssue1501() throws Exception { String ser = MAPPER.writeValueAsString(new Something1501(false)); try { MAPPER.readValue(ser, Something1501.class); fail("Should not pass"); } catch (JsonMappingException e) { verifyException(e, "Can not construct instance"); verifyException(e, "InnerSomething1501"); verifyException(e, "can only instantiate non-static inner class by using default"); } } public void testIssue1502() throws Exception { String ser = MAPPER.writeValueAsString(new Something1502(null)); try { MAPPER.readValue(ser, Something1502.class); fail("Should not pass"); } catch (JsonMappingException e) { verifyException(e, "Can not construct instance"); verifyException(e, "InnerSomething1502"); verifyException(e, "can only instantiate non-static inner class by using default"); } } public void testIssue1503() throws Exception { String ser = MAPPER.writeValueAsString(new Outer1503()); Outer1503 result = MAPPER.readValue(ser, Outer1503.class); assertNotNull(result); } }