From 85cdadc2c8c9fd3ec08c77fa8691e0aaa97719a4 Mon Sep 17 00:00:00 2001 From: Rossen Stoyanchev Date: Tue, 30 Nov 2021 17:27:32 +0000 Subject: [PATCH] Resolve merge conflict The convert method in ArgumentMethodArgumentResolver is gone and in any case ProjectedPayloadMethodArgumentResolver mainly needs to know the name of the argument if an Argument annotation is present. See gh-202 --- .../AnnotatedControllerConfigurer.java | 2 +- .../ArgumentMethodArgumentResolver.java | 28 +++++++++++-------- ...rojectedPayloadMethodArgumentResolver.java | 26 ++++++----------- 3 files changed, 25 insertions(+), 31 deletions(-) diff --git a/spring-graphql/src/main/java/org/springframework/graphql/data/method/annotation/support/AnnotatedControllerConfigurer.java b/spring-graphql/src/main/java/org/springframework/graphql/data/method/annotation/support/AnnotatedControllerConfigurer.java index 53eb11c6..4220794d 100644 --- a/spring-graphql/src/main/java/org/springframework/graphql/data/method/annotation/support/AnnotatedControllerConfigurer.java +++ b/spring-graphql/src/main/java/org/springframework/graphql/data/method/annotation/support/AnnotatedControllerConfigurer.java @@ -121,7 +121,7 @@ public class AnnotatedControllerConfigurer public void afterPropertiesSet() { this.argumentResolvers = new HandlerMethodArgumentResolverComposite(); if (springDataPresent) { - this.argumentResolvers.addResolver(new ProjectedPayloadMethodArgumentResolver(this.conversionService)); + this.argumentResolvers.addResolver(new ProjectedPayloadMethodArgumentResolver()); } this.argumentResolvers.addResolver(new ArgumentMapMethodArgumentResolver()); this.argumentResolvers.addResolver(new ArgumentMethodArgumentResolver(this.conversionService)); diff --git a/spring-graphql/src/main/java/org/springframework/graphql/data/method/annotation/support/ArgumentMethodArgumentResolver.java b/spring-graphql/src/main/java/org/springframework/graphql/data/method/annotation/support/ArgumentMethodArgumentResolver.java index 78272535..f17b41cc 100644 --- a/spring-graphql/src/main/java/org/springframework/graphql/data/method/annotation/support/ArgumentMethodArgumentResolver.java +++ b/spring-graphql/src/main/java/org/springframework/graphql/data/method/annotation/support/ArgumentMethodArgumentResolver.java @@ -59,18 +59,7 @@ public class ArgumentMethodArgumentResolver implements HandlerMethodArgumentReso @Override @SuppressWarnings("unchecked") public Object resolveArgument(MethodParameter parameter, DataFetchingEnvironment environment) throws Exception { - Argument annotation = parameter.getParameterAnnotation(Argument.class); - Assert.notNull(annotation, "No @Argument annotation"); - String name = annotation.name(); - if (!StringUtils.hasText(name)) { - name = parameter.getParameterName(); - if (name == null) { - throw new IllegalArgumentException( - "Name for argument of type [" + parameter.getNestedParameterType().getName() + - "] not specified, and parameter name information not found in class file either."); - } - } - + String name = getArgumentName(parameter); Object rawValue = environment.getArgument(name); TypeDescriptor typeDescriptor = new TypeDescriptor(parameter); @@ -111,6 +100,21 @@ public class ArgumentMethodArgumentResolver implements HandlerMethodArgumentReso return wrapAsOptionalIfNecessary(target, typeDescriptor.getType()); } + static String getArgumentName(MethodParameter parameter) { + Argument annotation = parameter.getParameterAnnotation(Argument.class); + Assert.state(annotation != null, "Expected @Argument annotation"); + if (StringUtils.hasText(annotation.name())) { + return annotation.name(); + } + String parameterName = parameter.getParameterName(); + if (parameterName != null) { + return parameterName; + } + throw new IllegalArgumentException( + "Name for argument of type [" + parameter.getNestedParameterType().getName() + + "] not specified, and parameter name information not found in class file either."); + } + @Nullable private Object wrapAsOptionalIfNecessary(@Nullable Object value, Class type) { return (type.equals(Optional.class) ? Optional.ofNullable(value) : value); diff --git a/spring-graphql/src/main/java/org/springframework/graphql/data/method/annotation/support/ProjectedPayloadMethodArgumentResolver.java b/spring-graphql/src/main/java/org/springframework/graphql/data/method/annotation/support/ProjectedPayloadMethodArgumentResolver.java index 0e5d8def..704b4a89 100644 --- a/spring-graphql/src/main/java/org/springframework/graphql/data/method/annotation/support/ProjectedPayloadMethodArgumentResolver.java +++ b/spring-graphql/src/main/java/org/springframework/graphql/data/method/annotation/support/ProjectedPayloadMethodArgumentResolver.java @@ -24,12 +24,10 @@ import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.BeanFactoryAware; import org.springframework.core.MethodParameter; import org.springframework.core.annotation.AnnotatedElementUtils; -import org.springframework.core.convert.ConversionService; import org.springframework.data.projection.SpelAwareProxyProjectionFactory; import org.springframework.data.web.ProjectedPayload; import org.springframework.graphql.data.method.HandlerMethodArgumentResolver; import org.springframework.graphql.data.method.annotation.Argument; -import org.springframework.lang.Nullable; /** * Resolver to obtain a {@link ProjectedPayload @ProjectedPayload} @@ -63,16 +61,6 @@ public class ProjectedPayloadMethodArgumentResolver implements HandlerMethodArgu private final SpelAwareProxyProjectionFactory projectionFactory = new SpelAwareProxyProjectionFactory(); - private final ArgumentMethodArgumentResolver argumentResolver; - - public ProjectedPayloadMethodArgumentResolver(@Nullable ConversionService conversionService) { - this.argumentResolver = new ArgumentMethodArgumentResolver(conversionService){ - @Override - protected Object convert(Object rawValue, Class targetType) { - return project(targetType, rawValue); - } - }; - } @Override public boolean supportsParameter(MethodParameter parameter) { @@ -87,15 +75,17 @@ public class ProjectedPayloadMethodArgumentResolver implements HandlerMethodArgu @Override public Object resolveArgument(MethodParameter parameter, DataFetchingEnvironment environment) throws Exception { - if(parameter.getParameterAnnotation(Argument.class) != null){ - return argumentResolver.resolveArgument(parameter, environment); - } + String name = (parameter.hasParameterAnnotation(Argument.class) ? + ArgumentMethodArgumentResolver.getArgumentName(parameter) : null); - return project(parameter.getParameterType(), environment.getArguments()); + Object projectionSource = (name != null ? + environment.getArgument(name) : environment.getArguments()); + + return project(parameter.getParameterType(), projectionSource); } - protected Object project(Class projectionType, Object source){ - return this.projectionFactory.createProjection(projectionType, source); + protected Object project(Class projectionType, Object projectionSource){ + return this.projectionFactory.createProjection(projectionType, projectionSource); } @Override