Skip to content

Commit 3bee3e8

Browse files
committed
Use ParameterNameDiscoverer with BatchMapping
Closes gh-562
1 parent 1e51daa commit 3bee3e8

File tree

2 files changed

+40
-0
lines changed

2 files changed

+40
-0
lines changed

spring-graphql/src/main/java/org/springframework/graphql/data/method/annotation/support/BatchLoaderHandlerMethod.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,9 @@
2929
import reactor.core.publisher.Mono;
3030

3131
import org.springframework.core.CollectionFactory;
32+
import org.springframework.core.DefaultParameterNameDiscoverer;
3233
import org.springframework.core.MethodParameter;
34+
import org.springframework.core.ParameterNameDiscoverer;
3335
import org.springframework.graphql.data.method.HandlerMethod;
3436
import org.springframework.graphql.data.method.InvocableHandlerMethodSupport;
3537
import org.springframework.graphql.data.method.annotation.ContextValue;
@@ -53,6 +55,9 @@ public class BatchLoaderHandlerMethod extends InvocableHandlerMethodSupport {
5355
AnnotatedControllerConfigurer.class.getClassLoader());
5456

5557

58+
private final ParameterNameDiscoverer parameterNameDiscoverer = new DefaultParameterNameDiscoverer();
59+
60+
5661
public BatchLoaderHandlerMethod(HandlerMethod handlerMethod, @Nullable Executor executor) {
5762
super(handlerMethod, executor);
5863
}
@@ -114,6 +119,8 @@ private <K> Object[] getMethodArgumentValues(Collection<K> keys, BatchLoaderEnvi
114119
private <K> Object resolveArgument(
115120
MethodParameter parameter, Collection<K> keys, BatchLoaderEnvironment environment) {
116121

122+
parameter.initParameterNameDiscovery(this.parameterNameDiscoverer);
123+
117124
Class<?> parameterType = parameter.getParameterType();
118125

119126
if (Collection.class.isAssignableFrom(parameterType)) {

spring-graphql/src/test/java/org/springframework/graphql/data/method/annotation/support/ContextValueMethodArgumentResolverTests.java

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,20 +17,25 @@
1717

1818
import java.lang.reflect.Method;
1919
import java.time.Duration;
20+
import java.util.Arrays;
21+
import java.util.List;
2022
import java.util.Optional;
2123
import java.util.function.BiConsumer;
2224

2325
import graphql.GraphQLContext;
2426
import graphql.schema.DataFetchingEnvironment;
2527
import graphql.schema.DataFetchingEnvironmentImpl;
28+
import org.dataloader.BatchLoaderEnvironment;
2629
import org.junit.jupiter.api.Test;
2730
import reactor.core.publisher.Mono;
2831
import reactor.test.StepVerifier;
2932

3033
import org.springframework.core.DefaultParameterNameDiscoverer;
3134
import org.springframework.core.MethodParameter;
3235
import org.springframework.core.annotation.SynthesizingMethodParameter;
36+
import org.springframework.graphql.Author;
3337
import org.springframework.graphql.Book;
38+
import org.springframework.graphql.BookSource;
3439
import org.springframework.graphql.data.method.HandlerMethod;
3540
import org.springframework.graphql.data.method.HandlerMethodArgumentResolverComposite;
3641
import org.springframework.graphql.data.method.annotation.ContextValue;
@@ -134,6 +139,28 @@ void resolveMono() throws Exception {
134139
StepVerifier.create((Mono<String>) handlerMethod.invoke(environment)).verifyComplete();
135140
}
136141

142+
@Test // gh-562
143+
void resolveFromParameterNameWithBatchMapping() throws Exception {
144+
145+
TestController controller = new TestController();
146+
147+
BatchLoaderHandlerMethod handlerMethod = new BatchLoaderHandlerMethod(
148+
new HandlerMethod(controller,
149+
TestController.class.getMethod("getAuthors", List.class, Long.class)), null);
150+
151+
GraphQLContext context = new GraphQLContext.Builder().build();
152+
context.put("id", 123L);
153+
154+
BatchLoaderEnvironment environment = BatchLoaderEnvironment.newBatchLoaderEnvironment().context(context).build();
155+
List<Book> keys = Arrays.asList(BookSource.getBook(1L), BookSource.getBook(2L), BookSource.getBook(3L));
156+
157+
StepVerifier.create(handlerMethod.invokeForIterable(keys, environment))
158+
.expectNextCount(3)
159+
.verifyComplete();
160+
161+
assertThat(controller.savedId).isEqualTo(context.get("id"));
162+
}
163+
137164
@Nullable
138165
private Object resolveValue(
139166
@Nullable GraphQLContext localContext, @Nullable GraphQLContext graphQLContext, int index) {
@@ -166,11 +193,17 @@ public void handle(
166193

167194
private static class TestController {
168195

196+
private Long savedId;
197+
169198
@Nullable
170199
public String handleMono(@ContextValue Mono<String> stringMono) {
171200
return stringMono.block(Duration.ofSeconds(1));
172201
}
173202

203+
public List<Author> getAuthors(List<Book> books, @ContextValue Long id) {
204+
this.savedId = id;
205+
return books.stream().map(Book::getAuthor).toList();
206+
}
174207
}
175208

176209
}

0 commit comments

Comments
 (0)