Skip to content

Commit fad4726

Browse files
committed
Fix #725
1 parent 3686421 commit fad4726

4 files changed

Lines changed: 25 additions & 23 deletions

File tree

release-notes/VERSION

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ Project: jackson-databind
1212
(reported by Charles A)
1313
#700: Cannot Change Default Abstract Type Mapper from LinkedHashMap
1414
(reported by wealdtech@github)
15+
#725: Auto-detect multi-argument constructor with implicit names if it is the only visible creator
1516
- Remove old cglib compatibility tests; cause problems in Eclipse
1617

1718
2.5.2 (not yet released)

src/main/java/com/fasterxml/jackson/databind/deser/BasicDeserializerFactory.java

Lines changed: 21 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,12 @@
66
import java.util.concurrent.atomic.AtomicReference;
77

88
import com.fasterxml.jackson.annotation.JsonCreator;
9+
910
import com.fasterxml.jackson.core.JsonLocation;
11+
1012
import com.fasterxml.jackson.databind.*;
1113
import com.fasterxml.jackson.databind.cfg.DeserializerFactoryConfig;
1214
import com.fasterxml.jackson.databind.cfg.HandlerInstantiator;
13-
import com.fasterxml.jackson.databind.cfg.MapperConfig;
1415
import com.fasterxml.jackson.databind.deser.impl.CreatorCollector;
1516
import com.fasterxml.jackson.databind.deser.std.*;
1617
import com.fasterxml.jackson.databind.ext.OptionalHandlerFactory;
@@ -19,11 +20,7 @@
1920
import com.fasterxml.jackson.databind.jsontype.TypeDeserializer;
2021
import com.fasterxml.jackson.databind.jsontype.TypeResolverBuilder;
2122
import com.fasterxml.jackson.databind.type.*;
22-
import com.fasterxml.jackson.databind.util.ClassUtil;
23-
import com.fasterxml.jackson.databind.util.EnumResolver;
24-
import com.fasterxml.jackson.databind.util.NameTransformer;
25-
import com.fasterxml.jackson.databind.util.SimpleBeanPropertyDefinition;
26-
import com.fasterxml.jackson.databind.util.TokenBuffer;
23+
import com.fasterxml.jackson.databind.util.*;
2724

2825
/**
2926
* Abstract factory base class that can provide deserializers for standard
@@ -495,10 +492,18 @@ public ValueInstantiator _valueInstantiatorInstance(DeserializationConfig config
495492
// simple case; everything covered:
496493
if ((namedCount + injectCount) == argCount) {
497494
creators.addPropertyCreator(ctor, isCreator, properties);
498-
} else if ((explicitNameCount == 0) && ((injectCount + 1) == argCount)) {
495+
continue;
496+
}
497+
if ((explicitNameCount == 0) && ((injectCount + 1) == argCount)) {
499498
// Secondary: all but one injectable, one un-annotated (un-named)
500499
creators.addDelegatingCreator(ctor, isCreator, properties);
501-
} else { // otherwise, epic fail
500+
continue;
501+
}
502+
// otherwise, epic fail?
503+
// 16-Mar-2015, tatu: due to [#725], need to be more permissive. For now let's
504+
// only report problem if there's no implicit name
505+
PropertyName impl = _findImplicitParamName(nonAnnotatedParam, intr);
506+
if (impl == null || impl.isEmpty()) {
502507
// Let's consider non-static inner class as a special case...
503508
int ix = nonAnnotatedParam.getIndex();
504509
if ((ix == 0) && ClassUtil.isNonStaticInnerClass(ctor.getDeclaringClass())) {
@@ -508,7 +513,6 @@ public ValueInstantiator _valueInstantiatorInstance(DeserializationConfig config
508513
throw new IllegalArgumentException("Argument #"+ix
509514
+" of constructor "+ctor+" has no property name annotation; must have name when multiple-parameter constructor annotated as Creator");
510515
}
511-
continue;
512516
}
513517
// [#725]: as a fallback, all-implicit names may work as well
514518
if (!creators.hasDefaultCreator()) {
@@ -518,7 +522,6 @@ public ValueInstantiator _valueInstantiatorInstance(DeserializationConfig config
518522
implicitCtors.add(ctor);
519523
}
520524
}
521-
522525
// last option, as per [#725]: consider implicit-names-only, visible constructor,
523526
// if just one found
524527
if ((implicitCtors != null) && !creators.hasDelegatingCreator()
@@ -546,7 +549,6 @@ protected void _checkImplicitlyNamedConstructors(DeserializationContext ctxt,
546549
continue;
547550
}
548551
// as per earlier notes, only end up here if no properties associated with creator
549-
550552
final int argCount = ctor.getParameterCount();
551553
CreatorProperty[] properties = new CreatorProperty[argCount];
552554
for (int i = 0; i < argCount; ++i) {
@@ -889,21 +891,20 @@ protected PropertyName _findParamName(AnnotatedParameter param, AnnotationIntros
889891
return null;
890892
}
891893

892-
@Deprecated // in 2.6, remove from 2.7
893-
protected PropertyName _findExplicitParamName(AnnotatedParameter param, AnnotationIntrospector intr)
894+
protected PropertyName _findImplicitParamName(AnnotatedParameter param, AnnotationIntrospector intr)
894895
{
895-
if (param != null && intr != null) {
896-
return intr.findNameForDeserialization(param);
896+
String str = intr.findImplicitPropertyName(param);
897+
if (str != null && !str.isEmpty()) {
898+
return PropertyName.construct(str);
897899
}
898900
return null;
899901
}
900902

901903
@Deprecated // in 2.6, remove from 2.7
902-
protected PropertyName _findImplicitParamName(AnnotatedParameter param, AnnotationIntrospector intr)
904+
protected PropertyName _findExplicitParamName(AnnotatedParameter param, AnnotationIntrospector intr)
903905
{
904-
String str = intr.findImplicitPropertyName(param);
905-
if (str != null && !str.isEmpty()) {
906-
return PropertyName.construct(str);
906+
if (param != null && intr != null) {
907+
return intr.findNameForDeserialization(param);
907908
}
908909
return null;
909910
}
@@ -917,7 +918,7 @@ protected boolean _hasExplicitParamName(AnnotatedParameter param, AnnotationIntr
917918
}
918919
return false;
919920
}
920-
921+
921922
/*
922923
/**********************************************************
923924
/* JsonDeserializerFactory impl: array deserializers

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ public class POJOPropertiesCollector
2020
/* Configuration
2121
/**********************************************************
2222
*/
23-
23+
2424
/**
2525
* Configuration settings
2626
*/

src/test/java/com/fasterxml/jackson/failing/MultiArgConstructorTest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -78,8 +78,8 @@ public void testMultiArgWithPartialOverride() throws Exception
7878
{
7979
final ObjectMapper mapper = new ObjectMapper();
8080
mapper.setAnnotationIntrospector(new MyParamIntrospector());
81-
MultiArgCtorBean bean = mapper.readValue(aposToQuotes("{'b2':7, 'c':222, 'a':-99}"),
82-
MultiArgCtorBean.class);
81+
MultiArgCtorBeanWithAnnotations bean = mapper.readValue(aposToQuotes("{'b2':7, 'c':222, 'a':-99}"),
82+
MultiArgCtorBeanWithAnnotations.class);
8383
assertNotNull(bean);
8484
assertEquals(7, bean._b);
8585
assertEquals(-99, bean._a);

0 commit comments

Comments
 (0)