66import java .util .concurrent .atomic .AtomicReference ;
77
88import com .fasterxml .jackson .annotation .JsonCreator ;
9+
910import com .fasterxml .jackson .core .JsonLocation ;
11+
1012import com .fasterxml .jackson .databind .*;
1113import com .fasterxml .jackson .databind .cfg .DeserializerFactoryConfig ;
1214import com .fasterxml .jackson .databind .cfg .HandlerInstantiator ;
13- import com .fasterxml .jackson .databind .cfg .MapperConfig ;
1415import com .fasterxml .jackson .databind .deser .impl .CreatorCollector ;
1516import com .fasterxml .jackson .databind .deser .std .*;
1617import com .fasterxml .jackson .databind .ext .OptionalHandlerFactory ;
1920import com .fasterxml .jackson .databind .jsontype .TypeDeserializer ;
2021import com .fasterxml .jackson .databind .jsontype .TypeResolverBuilder ;
2122import 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
0 commit comments