@@ -243,8 +243,8 @@ private Object bindMap(
243243 Constructor <?> constructor = BeanUtils .getResolvableConstructor (targetClass );
244244
245245 Object value = (constructor .getParameterCount () > 0 ) ?
246- bindMapToObjectViaConstructor ( rawMap , constructor , targetType , bindingResult ) :
247- bindMapToObjectViaSetters ( rawMap , constructor , targetType , bindingResult );
246+ bindViaConstructorAndSetters ( constructor , rawMap , targetType , bindingResult ) :
247+ bindViaSetters ( constructor , rawMap , targetType , bindingResult );
248248
249249 bindingResult .popNestedPath ();
250250
@@ -273,9 +273,8 @@ private Map<?, Object> bindMapToMap(
273273 }
274274
275275 @ Nullable
276- private Object bindMapToObjectViaConstructor (
277- Map <String , Object > rawMap , Constructor <?> constructor , ResolvableType ownerType ,
278- ArgumentsBindingResult bindingResult ) {
276+ private Object bindViaConstructorAndSetters (Constructor <?> constructor ,
277+ Map <String , Object > rawMap , ResolvableType ownerType , ArgumentsBindingResult bindingResult ) {
279278
280279 String [] paramNames = BeanUtils .getParameterNames (constructor );
281280 Class <?>[] paramTypes = constructor .getParameterTypes ();
@@ -291,13 +290,9 @@ private Object bindMapToObjectViaConstructor(
291290 name , rawMap .get (name ), !rawMap .containsKey (name ), targetType , paramTypes [i ], bindingResult );
292291 }
293292
293+ Object target ;
294294 try {
295- Object target = BeanUtils .instantiateClass (constructor , constructorArguments );
296- // only attempt further properties binding if there were no errors
297- if (!bindingResult .hasErrors ()) {
298- bindProperties (rawMap , ownerType , bindingResult , target );
299- }
300- return target ;
295+ target = BeanUtils .instantiateClass (constructor , constructorArguments );
301296 }
302297 catch (BeanInstantiationException ex ) {
303298 // Ignore, if we had binding errors to begin with
@@ -306,18 +301,26 @@ private Object bindMapToObjectViaConstructor(
306301 }
307302 throw ex ;
308303 }
304+
305+ // If no errors, apply setters too
306+ if (!bindingResult .hasErrors ()) {
307+ bindViaSetters (target , rawMap , ownerType , bindingResult );
308+ }
309+
310+ return target ;
309311 }
310312
311- private Object bindMapToObjectViaSetters (
312- Map <String , Object > rawMap , Constructor <?> constructor , ResolvableType ownerType ,
313- ArgumentsBindingResult bindingResult ) {
313+ private Object bindViaSetters (Constructor <?> constructor ,
314+ Map <String , Object > rawMap , ResolvableType ownerType , ArgumentsBindingResult bindingResult ) {
314315
315316 Object target = BeanUtils .instantiateClass (constructor );
316- bindProperties ( rawMap , ownerType , bindingResult , target );
317+ bindViaSetters ( target , rawMap , ownerType , bindingResult );
317318 return target ;
318319 }
319320
320- private void bindProperties (Map <String , Object > rawMap , ResolvableType ownerType , ArgumentsBindingResult bindingResult , Object target ) {
321+ private void bindViaSetters (Object target ,
322+ Map <String , Object > rawMap , ResolvableType ownerType , ArgumentsBindingResult bindingResult ) {
323+
321324 BeanWrapper beanWrapper = (this .fallBackOnDirectFieldAccess ?
322325 new DirectFieldAccessFallbackBeanWrapper (target ) : PropertyAccessorFactory .forBeanPropertyAccess (target ));
323326
@@ -355,7 +358,6 @@ private void bindProperties(Map<String, Object> rawMap, ResolvableType ownerType
355358 }
356359 }
357360
358-
359361 @ SuppressWarnings ("unchecked" )
360362 @ Nullable
361363 private <T > T convertValue (
0 commit comments