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
This commit is contained in:
Rossen Stoyanchev
2021-11-30 17:27:32 +00:00
parent 5aa72f216f
commit 85cdadc2c8
3 changed files with 25 additions and 31 deletions

View File

@@ -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));

View File

@@ -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);

View File

@@ -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