Skip to content

Commit 9f9822a

Browse files
committed
Bit of tweaking for #1631 to try to prevent accidental application. Also renamed feature as MapperFeature.CREATOR_MODE_DEFAULT_PROPERTIES
1 parent d6b78ae commit 9f9822a

31 files changed

+80
-40
lines changed

src/main/java/com/fasterxml/jackson/databind/MapperFeature.java

+11-4
Original file line numberDiff line numberDiff line change
@@ -215,13 +215,20 @@ public enum MapperFeature implements ConfigFeature
215215
INFER_CREATOR_FROM_CONSTRUCTOR_PROPERTIES(true),
216216

217217
/**
218-
* Feature that determines handling of creators.
219-
* When enabled, in a case where JsonCreator mode can't be resolved it will be
220-
* resolved as {@link JsonCreator.Mode.PROPERTIES} instead.
218+
* Feature that determines whether single-argument creator without explicit
219+
* mode definition should be assumed to be "property-based" creator (expect JSON
220+
* Obejct, bind named property that matches argument name) or not.
221+
* If not, default logic usually chooses "delegating" mode instead (input value directly bound
222+
* to nominal type of the argument, ignoring its name, if any).
223+
* If feature is enabled, type is assumed to be "property-based"; if disabled,
224+
* heuristics will be used to try to determine better match, usually leading
225+
* to choice of "delegating" mode.
226+
*<p>
227+
* Feature is disabled by default for backwards compatibility.
221228
*
222229
* @since 2.9
223230
*/
224-
SET_PROPERTY_CREATOR_AS_DEFAULT(false),
231+
CREATOR_MODE_DEFAULT_PROPERTIES(false),
225232

226233
/*
227234
/******************************************************

src/main/java/com/fasterxml/jackson/databind/introspect/JacksonAnnotationIntrospector.java

+7-6
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import java.util.*;
66

77
import com.fasterxml.jackson.annotation.*;
8+
import com.fasterxml.jackson.annotation.JsonCreator.Mode;
89
import com.fasterxml.jackson.core.Version;
910
import com.fasterxml.jackson.databind.*;
1011
import com.fasterxml.jackson.databind.annotation.*;
@@ -1303,7 +1304,12 @@ public JsonCreator.Mode findCreatorBinding(Annotated a) {
13031304
public JsonCreator.Mode findCreatorAnnotation(MapperConfig<?> config, Annotated a) {
13041305
JsonCreator ann = _findAnnotation(a, JsonCreator.class);
13051306
if (ann != null) {
1306-
return ann.mode();
1307+
JsonCreator.Mode mode = ann.mode();
1308+
if ((mode == Mode.DEFAULT)
1309+
&& config.isEnabled(MapperFeature.CREATOR_MODE_DEFAULT_PROPERTIES)) {
1310+
mode = JsonCreator.Mode.PROPERTIES;
1311+
}
1312+
return mode;
13071313
}
13081314

13091315
if (_cfgConstructorPropertiesImpliesCreator
@@ -1320,11 +1326,6 @@ public JsonCreator.Mode findCreatorAnnotation(MapperConfig<?> config, Annotated
13201326
}
13211327
}
13221328
}
1323-
1324-
if(config.isEnabled(MapperFeature.SET_PROPERTY_CREATOR_AS_DEFAULT)) {
1325-
return JsonCreator.Mode.PROPERTIES;
1326-
}
1327-
13281329
return null;
13291330
}
13301331

src/test/java/com/fasterxml/jackson/databind/creators/ArrayDelegatorCreatorForCollectionTest.java renamed to src/test/java/com/fasterxml/jackson/databind/deser/creators/ArrayDelegatorCreatorForCollectionTest.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.fasterxml.jackson.databind.creators;
1+
package com.fasterxml.jackson.databind.deser.creators;
22

33
import java.util.Collections;
44
import java.util.Set;

src/test/java/com/fasterxml/jackson/databind/creators/BigCreatorTest.java renamed to src/test/java/com/fasterxml/jackson/databind/deser/creators/BigCreatorTest.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.fasterxml.jackson.databind.creators;
1+
package com.fasterxml.jackson.databind.deser.creators;
22

33
import com.fasterxml.jackson.annotation.*;
44

src/test/java/com/fasterxml/jackson/databind/creators/CreatorPropertiesTest.java renamed to src/test/java/com/fasterxml/jackson/databind/deser/creators/CreatorPropertiesTest.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.fasterxml.jackson.databind.creators;
1+
package com.fasterxml.jackson.databind.deser.creators;
22

33
import java.beans.ConstructorProperties;
44

src/test/java/com/fasterxml/jackson/databind/creators/CreatorWithObjectIdTest.java renamed to src/test/java/com/fasterxml/jackson/databind/deser/creators/CreatorWithObjectIdTest.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.fasterxml.jackson.databind.creators;
1+
package com.fasterxml.jackson.databind.deser.creators;
22

33
import java.beans.ConstructorProperties;
44

src/test/java/com/fasterxml/jackson/databind/creators/DelegatingCreatorImplicitNames1001Test.java renamed to src/test/java/com/fasterxml/jackson/databind/deser/creators/DelegatingCreatorImplicitNames1001Test.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.fasterxml.jackson.databind.creators;
1+
package com.fasterxml.jackson.databind.deser.creators;
22

33
import com.fasterxml.jackson.annotation.*;
44
import com.fasterxml.jackson.databind.*;

src/test/java/com/fasterxml/jackson/databind/creators/DelegatingExternalProperty1003Test.java renamed to src/test/java/com/fasterxml/jackson/databind/deser/creators/DelegatingExternalProperty1003Test.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.fasterxml.jackson.databind.creators;
1+
package com.fasterxml.jackson.databind.deser.creators;
22

33
import com.fasterxml.jackson.annotation.*;
44

src/test/java/com/fasterxml/jackson/databind/creators/DisablingCreatorsTest.java renamed to src/test/java/com/fasterxml/jackson/databind/deser/creators/DisablingCreatorsTest.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.fasterxml.jackson.databind.creators;
1+
package com.fasterxml.jackson.databind.deser.creators;
22

33
import com.fasterxml.jackson.annotation.JsonCreator;
44
import com.fasterxml.jackson.annotation.JsonProperty;

src/test/java/com/fasterxml/jackson/databind/creators/EnumCreatorTest.java renamed to src/test/java/com/fasterxml/jackson/databind/deser/creators/EnumCreatorTest.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.fasterxml.jackson.databind.creators;
1+
package com.fasterxml.jackson.databind.deser.creators;
22

33
import java.math.BigDecimal;
44
import java.util.*;

src/test/java/com/fasterxml/jackson/databind/creators/FailOnNullCreatorTest.java renamed to src/test/java/com/fasterxml/jackson/databind/deser/creators/FailOnNullCreatorTest.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.fasterxml.jackson.databind.creators;
1+
package com.fasterxml.jackson.databind.deser.creators;
22

33
import com.fasterxml.jackson.annotation.JsonCreator;
44
import com.fasterxml.jackson.annotation.JsonProperty;

src/test/java/com/fasterxml/jackson/databind/creators/ImplicitNameMatch792Test.java renamed to src/test/java/com/fasterxml/jackson/databind/deser/creators/ImplicitNameMatch792Test.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.fasterxml.jackson.databind.creators;
1+
package com.fasterxml.jackson.databind.deser.creators;
22

33
import com.fasterxml.jackson.annotation.JsonProperty;
44
import com.fasterxml.jackson.annotation.JsonPropertyOrder;

src/test/java/com/fasterxml/jackson/databind/creators/ImplicitParamsForCreatorTest.java renamed to src/test/java/com/fasterxml/jackson/databind/deser/creators/ImplicitParamsForCreatorTest.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.fasterxml.jackson.databind.creators;
1+
package com.fasterxml.jackson.databind.deser.creators;
22

33
import com.fasterxml.jackson.databind.*;
44
import com.fasterxml.jackson.databind.introspect.AnnotatedMember;

src/test/java/com/fasterxml/jackson/databind/creators/InnerClassCreatorTest.java renamed to src/test/java/com/fasterxml/jackson/databind/deser/creators/InnerClassCreatorTest.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.fasterxml.jackson.databind.creators;
1+
package com.fasterxml.jackson.databind.deser.creators;
22

33
import com.fasterxml.jackson.annotation.JsonCreator;
44
import com.fasterxml.jackson.annotation.JsonProperty;

src/test/java/com/fasterxml/jackson/databind/creators/MultiArgConstructorTest.java renamed to src/test/java/com/fasterxml/jackson/databind/deser/creators/MultiArgConstructorTest.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.fasterxml.jackson.databind.creators;
1+
package com.fasterxml.jackson.databind.deser.creators;
22

33
import com.fasterxml.jackson.annotation.JsonAutoDetect;
44
import com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility;

src/test/java/com/fasterxml/jackson/databind/creators/RequiredCreatorTest.java renamed to src/test/java/com/fasterxml/jackson/databind/deser/creators/RequiredCreatorTest.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.fasterxml.jackson.databind.creators;
1+
package com.fasterxml.jackson.databind.deser.creators;
22

33
import com.fasterxml.jackson.annotation.*;
44

src/test/java/com/fasterxml/jackson/databind/creators/SingleArgCreatorTest.java renamed to src/test/java/com/fasterxml/jackson/databind/deser/creators/SingleArgCreatorTest.java

+34-2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1-
package com.fasterxml.jackson.databind.creators;
1+
package com.fasterxml.jackson.databind.deser.creators;
2+
3+
import java.util.Map;
24

35
import com.fasterxml.jackson.annotation.*;
46
import com.fasterxml.jackson.databind.*;
@@ -139,6 +141,16 @@ public static SingleArgWithImplicit from(XY v) {
139141
public XY getFoobar() { return _value; }
140142
}
141143

144+
// [databind#1631]
145+
static class SingleArg1631 {
146+
Object value;
147+
148+
@JsonCreator // but no mode!
149+
public SingleArg1631(Object arg) {
150+
value = arg;
151+
}
152+
}
153+
142154
/*
143155
/**********************************************************
144156
/* Test methods
@@ -207,5 +219,25 @@ public void testSingleImplicitDelegating() throws Exception
207219
assertEquals(1, v.x);
208220
assertEquals(2, v.y);
209221
}
210-
}
211222

223+
// [databind#1631]
224+
public void testSingleArgAsPropertiesViaFeature() throws Exception
225+
{
226+
// First things first: should default to delegating, in absence of anything else:
227+
SingleArg1631 result = MAPPER.readValue(quote("zap"), SingleArg1631.class);
228+
assertEquals("zap", result.value);
229+
230+
// and should bind to Map if given JSON Object (since nominal type Object)
231+
final String json = aposToQuotes("{'ctor':'ding'}");
232+
result = MAPPER.readValue(json, SingleArg1631.class);
233+
assertTrue(result.value instanceof Map<?,?>);
234+
235+
// But change of defaults should work wonders:
236+
final ObjectMapper mapper = new ObjectMapper();
237+
mapper.enable(MapperFeature.CREATOR_MODE_DEFAULT_PROPERTIES);
238+
mapper.setAnnotationIntrospector(new MyParamIntrospector("ctor"));
239+
240+
result = mapper.readValue(json, SingleArg1631.class);
241+
assertEquals("ding", result.value);
242+
}
243+
}

src/test/java/com/fasterxml/jackson/databind/creators/TestConstructFromMap.java renamed to src/test/java/com/fasterxml/jackson/databind/deser/creators/TestConstructFromMap.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.fasterxml.jackson.databind.creators;
1+
package com.fasterxml.jackson.databind.deser.creators;
22

33
import java.math.BigDecimal;
44
import java.util.*;

src/test/java/com/fasterxml/jackson/databind/creators/TestCreatorNullValue.java renamed to src/test/java/com/fasterxml/jackson/databind/deser/creators/TestCreatorNullValue.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.fasterxml.jackson.databind.creators;
1+
package com.fasterxml.jackson.databind.deser.creators;
22

33
import java.io.IOException;
44
import java.util.UUID;

src/test/java/com/fasterxml/jackson/databind/creators/TestCreatorWithNamingStrategy556.java renamed to src/test/java/com/fasterxml/jackson/databind/deser/creators/TestCreatorWithNamingStrategy556.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.fasterxml.jackson.databind.creators;
1+
package com.fasterxml.jackson.databind.deser.creators;
22

33
import com.fasterxml.jackson.annotation.JsonCreator;
44
import com.fasterxml.jackson.databind.*;

src/test/java/com/fasterxml/jackson/databind/creators/TestCreatorWithPolymorphic113.java renamed to src/test/java/com/fasterxml/jackson/databind/deser/creators/TestCreatorWithPolymorphic113.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.fasterxml.jackson.databind.creators;
1+
package com.fasterxml.jackson.databind.deser.creators;
22

33
import com.fasterxml.jackson.annotation.*;
44

src/test/java/com/fasterxml/jackson/databind/creators/TestCreators.java renamed to src/test/java/com/fasterxml/jackson/databind/deser/creators/TestCreators.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.fasterxml.jackson.databind.creators;
1+
package com.fasterxml.jackson.databind.deser.creators;
22

33
import java.util.*;
44

src/test/java/com/fasterxml/jackson/databind/creators/TestCreators2.java renamed to src/test/java/com/fasterxml/jackson/databind/deser/creators/TestCreators2.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11

2-
package com.fasterxml.jackson.databind.creators;
2+
package com.fasterxml.jackson.databind.deser.creators;
33

44
import java.io.IOException;
55
import java.util.List;

src/test/java/com/fasterxml/jackson/databind/creators/TestCreators421.java renamed to src/test/java/com/fasterxml/jackson/databind/deser/creators/TestCreators421.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.fasterxml.jackson.databind.creators;
1+
package com.fasterxml.jackson.databind.deser.creators;
22

33
import com.fasterxml.jackson.annotation.JsonCreator;
44
import com.fasterxml.jackson.annotation.JsonProperty;

src/test/java/com/fasterxml/jackson/databind/creators/TestCreators541.java renamed to src/test/java/com/fasterxml/jackson/databind/deser/creators/TestCreators541.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.fasterxml.jackson.databind.creators;
1+
package com.fasterxml.jackson.databind.deser.creators;
22

33
import java.util.*;
44

src/test/java/com/fasterxml/jackson/databind/creators/TestCreatorsDelegating.java renamed to src/test/java/com/fasterxml/jackson/databind/deser/creators/TestCreatorsDelegating.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.fasterxml.jackson.databind.creators;
1+
package com.fasterxml.jackson.databind.deser.creators;
22

33
import com.fasterxml.jackson.annotation.JsonCreator;
44

src/test/java/com/fasterxml/jackson/databind/creators/TestCreatorsWithIdentity.java renamed to src/test/java/com/fasterxml/jackson/databind/deser/creators/TestCreatorsWithIdentity.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.fasterxml.jackson.databind.creators;
1+
package com.fasterxml.jackson.databind.deser.creators;
22

33
import java.io.IOException;
44

src/test/java/com/fasterxml/jackson/databind/creators/TestCustomValueInstDefaults.java renamed to src/test/java/com/fasterxml/jackson/databind/deser/creators/TestCustomValueInstDefaults.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.fasterxml.jackson.databind.creators;
1+
package com.fasterxml.jackson.databind.deser.creators;
22

33
import java.io.IOException;
44

src/test/java/com/fasterxml/jackson/databind/creators/TestPolymorphicCreators.java renamed to src/test/java/com/fasterxml/jackson/databind/deser/creators/TestPolymorphicCreators.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.fasterxml.jackson.databind.creators;
1+
package com.fasterxml.jackson.databind.deser.creators;
22

33
import com.fasterxml.jackson.annotation.*;
44

src/test/java/com/fasterxml/jackson/databind/creators/TestPolymorphicDelegating.java renamed to src/test/java/com/fasterxml/jackson/databind/deser/creators/TestPolymorphicDelegating.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.fasterxml.jackson.databind.creators;
1+
package com.fasterxml.jackson.databind.deser.creators;
22

33
import com.fasterxml.jackson.annotation.*;
44
import com.fasterxml.jackson.databind.*;

src/test/java/com/fasterxml/jackson/databind/creators/TestValueInstantiator.java renamed to src/test/java/com/fasterxml/jackson/databind/deser/creators/TestValueInstantiator.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.fasterxml.jackson.databind.creators;
1+
package com.fasterxml.jackson.databind.deser.creators;
22

33
import java.io.IOException;
44
import java.util.ArrayList;

0 commit comments

Comments
 (0)