Skip to content

Commit 2259a00

Browse files
committed
Polishing in GraphQlArgumentBinder
1 parent 450cef1 commit 2259a00

File tree

2 files changed

+23
-21
lines changed

2 files changed

+23
-21
lines changed

Diff for: spring-graphql/src/main/java/org/springframework/graphql/data/GraphQlArgumentBinder.java

+19-17
Original file line numberDiff line numberDiff line change
@@ -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(

Diff for: spring-graphql/src/test/java/org/springframework/graphql/data/GraphQlArgumentBinderTests.java

+4-4
Original file line numberDiff line numberDiff line change
@@ -195,14 +195,14 @@ void primaryConstructor() throws Exception {
195195
assertThat(result).hasFieldOrPropertyWithValue("name", "test");
196196
}
197197

198-
@Test
198+
@Test // gh-1163
199199
void mixedConstructorProperties() throws Exception {
200200

201-
Object result = bind("{\"name\":\"test\", \"age\":30}", ResolvableType.forClass(MixedConstructorPropertiesBean.class));
201+
Object result = bind("{\"name\":\"test\", \"age\":30}",
202+
ResolvableType.forClass(MixedConstructorPropertiesBean.class));
202203

203204
assertThat(result).isNotNull().isInstanceOf(MixedConstructorPropertiesBean.class);
204-
assertThat(result).hasFieldOrPropertyWithValue("name", "test")
205-
.hasFieldOrPropertyWithValue("age", 30);
205+
assertThat(result).hasFieldOrPropertyWithValue("name", "test").hasFieldOrPropertyWithValue("age", 30);
206206
}
207207

208208
@Test

0 commit comments

Comments
 (0)