@@ -83,8 +83,8 @@ public RelaxedDataBinder(Object target) {
8383 * @param namePrefix An optional prefix to be used when reading properties
8484 */
8585 public RelaxedDataBinder (Object target , String namePrefix ) {
86- super (wrapTarget (target ), ( StringUtils . hasLength ( namePrefix ) ? namePrefix
87- : DEFAULT_OBJECT_NAME ));
86+ super (wrapTarget (target ),
87+ ( StringUtils . hasLength ( namePrefix ) ? namePrefix : DEFAULT_OBJECT_NAME ));
8888 this .namePrefix = cleanNamePrefix (namePrefix );
8989 }
9090
@@ -146,7 +146,8 @@ private MutablePropertyValues modifyProperties(MutablePropertyValues propertyVal
146146 propertyValues = addMapPrefix (propertyValues );
147147 }
148148 BeanWrapper wrapper = new BeanWrapperImpl (target );
149- wrapper .setConversionService (new RelaxedConversionService (getConversionService ()));
149+ wrapper .setConversionService (
150+ new RelaxedConversionService (getConversionService ()));
150151 wrapper .setAutoGrowNestedPaths (true );
151152 List <PropertyValue > sortedValues = new ArrayList <PropertyValue >();
152153 Set <String > modifiedNames = new HashSet <String >();
@@ -214,16 +215,17 @@ private MutablePropertyValues getPropertyValuesForNamePrefix(
214215 name = name .substring (candidate .length ());
215216 if (!(this .ignoreNestedProperties && name .contains ("." ))) {
216217 PropertyOrigin propertyOrigin = findPropertyOrigin (value );
217- rtn .addPropertyValue (new OriginCapablePropertyValue (name , value
218- .getValue (), propertyOrigin ));
218+ rtn .addPropertyValue (new OriginCapablePropertyValue (name ,
219+ value .getValue (), propertyOrigin ));
219220 }
220221 }
221222 }
222223 }
223224 return rtn ;
224225 }
225226
226- private PropertyValue modifyProperty (BeanWrapper target , PropertyValue propertyValue ) {
227+ private PropertyValue modifyProperty (BeanWrapper target ,
228+ PropertyValue propertyValue ) {
227229 String name = propertyValue .getName ();
228230 String normalizedName = normalizePath (target , name );
229231 if (!normalizedName .equals (name )) {
@@ -277,8 +279,8 @@ public void setPropertyValue(PropertyValue pv) throws BeansException {
277279 }
278280 }
279281 };
280- beanWrapper .setConversionService (new RelaxedConversionService (
281- getConversionService ()));
282+ beanWrapper .setConversionService (
283+ new RelaxedConversionService ( getConversionService ()));
282284 beanWrapper .registerCustomEditor (InetAddress .class ,
283285 new InetAddressEditor ());
284286 return beanWrapper ;
@@ -352,8 +354,8 @@ private boolean isMapValueStringType(TypeDescriptor descriptor) {
352354
353355 @ SuppressWarnings ("rawtypes" )
354356 private boolean isBlanked (BeanWrapper wrapper , String propertyName , String key ) {
355- Object value = (wrapper .isReadableProperty (propertyName ) ? wrapper
356- .getPropertyValue (propertyName ) : null );
357+ Object value = (wrapper .isReadableProperty (propertyName )
358+ ? wrapper .getPropertyValue (propertyName ) : null );
357359 if (value instanceof Map ) {
358360 if (((Map ) value ).get (key ) == BLANK ) {
359361 return true ;
@@ -362,7 +364,8 @@ private boolean isBlanked(BeanWrapper wrapper, String propertyName, String key)
362364 return false ;
363365 }
364366
365- private void extendCollectionIfNecessary (BeanWrapper wrapper , BeanPath path , int index ) {
367+ private void extendCollectionIfNecessary (BeanWrapper wrapper , BeanPath path ,
368+ int index ) {
366369 String name = path .prefix (index );
367370 TypeDescriptor elementDescriptor = wrapper .getPropertyTypeDescriptor (name )
368371 .getElementTypeDescriptor ();
@@ -425,6 +428,12 @@ private String resolveNestedPropertyName(BeanWrapper target, String prefix,
425428 candidate .append (field );
426429 String nested = resolvePropertyName (target , prefix , candidate .toString ());
427430 if (nested != null ) {
431+ Class <?> type = target .getPropertyType (nested );
432+ if (type != null && Map .class .isAssignableFrom (type )) {
433+ // Special case for map property (gh-3836). Maybe could be fixed
434+ // in spring-beans)?
435+ return nested + "[" + name .substring (candidate .length () + 1 ) + "]" ;
436+ }
428437 String propertyName = resolvePropertyName (target ,
429438 joinString (prefix , nested ),
430439 name .substring (candidate .length () + 1 ));
0 commit comments