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