Skip to content

Commit 287dab0

Browse files
committed
Merge branch '1.1.x'
2 parents e268e5e + 2e229fe commit 287dab0

File tree

2 files changed

+33
-6
lines changed

2 files changed

+33
-6
lines changed

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

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
package org.springframework.graphql.data.method.annotation.support;
1717

1818
import java.util.Arrays;
19+
import java.util.concurrent.CompletableFuture;
1920
import java.util.concurrent.Executor;
2021
import java.util.function.BiConsumer;
2122

@@ -133,11 +134,14 @@ public Object invoke(DataFetchingEnvironment environment, Object... providedArgs
133134
}) :
134135
toArgsMono(args).flatMap(argValues -> {
135136
Object result = validateAndInvoke(argValues, environment);
136-
if (result instanceof Mono) {
137-
return (Mono<?>) result;
137+
if (result instanceof Mono<?> mono) {
138+
return mono;
138139
}
139-
else if (result instanceof Flux) {
140-
return Flux.from((Flux<?>) result).collectList();
140+
else if (result instanceof Flux<?> flux) {
141+
return Flux.from(flux).collectList();
142+
}
143+
else if (result instanceof CompletableFuture<?> future) {
144+
return Mono.fromFuture(future);
141145
}
142146
else {
143147
return Mono.justOrEmpty(result);

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

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2002-2022 the original author or authors.
2+
* Copyright 2002-2023 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -24,9 +24,9 @@
2424
import graphql.GraphQLContext;
2525
import graphql.schema.DataFetchingEnvironment;
2626
import graphql.schema.DataFetchingEnvironmentImpl;
27-
import io.micrometer.context.ContextSnapshot;
2827
import org.junit.jupiter.api.Test;
2928
import org.mockito.Mockito;
29+
import reactor.core.publisher.Mono;
3030

3131
import org.springframework.core.task.SimpleAsyncTaskExecutor;
3232
import org.springframework.graphql.data.GraphQlArgumentBinder;
@@ -36,6 +36,8 @@
3636
import org.springframework.graphql.data.method.annotation.Argument;
3737
import org.springframework.graphql.data.method.annotation.QueryMapping;
3838
import org.springframework.lang.Nullable;
39+
import org.springframework.security.core.annotation.AuthenticationPrincipal;
40+
import org.springframework.security.core.userdetails.User;
3941
import org.springframework.util.ClassUtils;
4042

4143
import static org.assertj.core.api.Assertions.assertThat;
@@ -86,6 +88,23 @@ void callableReturnValue() throws Exception {
8688
assertThat(future.get()).isEqualTo("A");
8789
}
8890

91+
@Test
92+
void completableFutureReturnValue() {
93+
94+
HandlerMethodArgumentResolverComposite resolvers = new HandlerMethodArgumentResolverComposite();
95+
resolvers.addResolver(new AuthenticationPrincipalArgumentResolver((beanName, context) -> null));
96+
resolvers.addResolver(new ArgumentMethodArgumentResolver(new GraphQlArgumentBinder()));
97+
98+
DataFetcherHandlerMethod handlerMethod = new DataFetcherHandlerMethod(
99+
handlerMethodFor(new TestController(), "handleAndReturnFuture"), resolvers,
100+
null, null, false);
101+
102+
Object result = handlerMethod.invoke(DataFetchingEnvironmentImpl.newDataFetchingEnvironment().build());
103+
104+
assertThat(result).isInstanceOf(Mono.class);
105+
assertThat(((Mono<String>) result).block()).isEqualTo("B");
106+
}
107+
89108
private static HandlerMethod handlerMethodFor(Object controller, String methodName) {
90109
Method method = ClassUtils.getMethod(controller.getClass(), methodName, (Class<?>[]) null);
91110
return new HandlerMethod(controller, method);
@@ -112,6 +131,10 @@ public Callable<String> handleAndReturnCallable() {
112131
return () -> "A";
113132
}
114133

134+
public CompletableFuture<String> handleAndReturnFuture(@AuthenticationPrincipal User user) {
135+
return CompletableFuture.completedFuture("B");
136+
}
137+
115138
}
116139

117140
}

0 commit comments

Comments
 (0)