package com.fasterxml.jackson.databind.creators; import java.beans.ConstructorProperties; import com.fasterxml.jackson.annotation.*; import com.fasterxml.jackson.databind.*; public class CreatorPropertiesTest extends BaseMapTest { static class Issue905Bean { // 08-Nov-2015, tatu: Note that in real code we would most likely use same // names for properties; but here we use different name on purpose to // ensure that Jackson has no way of binding JSON properties "x" and "y" // using any other mechanism than via `@ConstructorProperties` annotation public int _x, _y; @ConstructorProperties({"x", "y"}) // Same as above; use differing local parameter names so that parameter name // introspection can not be used as the source of property names. public Issue905Bean(int a, int b) { _x = a; _y = b; } } // for [databind#1122] static class Ambiguity { @JsonProperty("bar") private int foo; protected Ambiguity() {} @ConstructorProperties({ "foo" }) public Ambiguity(int foo) { this.foo = foo; } public int getFoo() { return foo; } @Override public String toString() { return "Ambiguity [foo=" + foo + "]"; } } // for [databind#1371] static class Lombok1371Bean { public int x, y; protected Lombok1371Bean() { } @ConstructorProperties({ "x", "y" }) public Lombok1371Bean(int _x, int _y) { x = _x + 1; y = _y + 1; } } /* /********************************************************** /* Test methods /********************************************************** */ private final ObjectMapper MAPPER = new ObjectMapper(); // [databind#905] public void testCreatorPropertiesAnnotation() throws Exception { Issue905Bean b = MAPPER.readValue(aposToQuotes("{'y':3,'x':2}"), Issue905Bean.class); assertEquals(2, b._x); assertEquals(3, b._y); } // [databind#1122] public void testPossibleNamingConflict() throws Exception { String json = "{\"bar\":3}"; Ambiguity amb = MAPPER.readValue(json, Ambiguity.class); assertNotNull(amb); assertEquals(3, amb.getFoo()); } // [databind#1371]: MapperFeature.INFER_CREATOR_FROM_CONSTRUCTOR_PROPERTIES public void testConstructorPropertiesInference() throws Exception { final String JSON = aposToQuotes("{'x':3,'y':5}"); // by default, should detect and use arguments-taking constructor as creator assertTrue(MAPPER.isEnabled(MapperFeature.INFER_CREATOR_FROM_CONSTRUCTOR_PROPERTIES)); Lombok1371Bean result = MAPPER.readValue(JSON, Lombok1371Bean.class); assertEquals(4, result.x); assertEquals(6, result.y); // but change if configuration changed ObjectMapper mapper = new ObjectMapper(); mapper.disable(MapperFeature.INFER_CREATOR_FROM_CONSTRUCTOR_PROPERTIES); // in which case fields are set directly: result = mapper.readValue(JSON, Lombok1371Bean.class); assertEquals(3, result.x); assertEquals(5, result.y); } }