diff --git a/spring-graphql/src/main/java/org/springframework/graphql/execution/DataFetcherExceptionResolver.java b/spring-graphql/src/main/java/org/springframework/graphql/execution/DataFetcherExceptionResolver.java index 3b49dac7..9837390e 100644 --- a/spring-graphql/src/main/java/org/springframework/graphql/execution/DataFetcherExceptionResolver.java +++ b/spring-graphql/src/main/java/org/springframework/graphql/execution/DataFetcherExceptionResolver.java @@ -27,12 +27,9 @@ import reactor.core.publisher.Mono; * {@code GraphQLError}'s to add to the GraphQL response. Implementations are typically * declared as beans in Spring configuration and invoked in order until one emits a List. * - *
- * Use the {@link SingleErrorExceptionResolver} convenience adapter when you need to
- * resolve exceptions to a single {@code GraphQLError} only.
- *
* @author Rossen Stoyanchev
* @since 1.0.0
+ * @see SyncDataFetcherExceptionResolver
*/
public interface DataFetcherExceptionResolver {
diff --git a/spring-graphql/src/main/java/org/springframework/graphql/execution/ExceptionResolversExceptionHandler.java b/spring-graphql/src/main/java/org/springframework/graphql/execution/ExceptionResolversExceptionHandler.java
index 502d3fda..c7d263ae 100644
--- a/spring-graphql/src/main/java/org/springframework/graphql/execution/ExceptionResolversExceptionHandler.java
+++ b/spring-graphql/src/main/java/org/springframework/graphql/execution/ExceptionResolversExceptionHandler.java
@@ -70,7 +70,7 @@ class ExceptionResolversExceptionHandler implements DataFetcherExceptionHandler
// https://github.com/graphql-java/graphql-java/issues/2356
try {
return Flux.fromIterable(this.resolvers)
- .flatMap((resolver) -> resolver.resolveException(ex, env))
+ .flatMap((resolver) -> resolveErrors(ex, env, resolver))
.next()
.map((errors) -> DataFetcherExceptionHandlerResult.newResult().errors(errors).build())
.switchIfEmpty(Mono.fromCallable(() -> applyDefaultHandling(ex, env)))
@@ -89,6 +89,19 @@ class ExceptionResolversExceptionHandler implements DataFetcherExceptionHandler
}
}
+ private Mono> resolveErrors(
+ Throwable ex, DataFetchingEnvironment environment, DataFetcherExceptionResolver resolver) {
+
+ ContextView contextView = ContextManager.getReactorContext(environment);
+ try {
+ ContextManager.restoreThreadLocalValues(contextView);
+ return resolver.resolveException(ex, environment);
+ }
+ finally {
+ ContextManager.resetThreadLocalValues(contextView);
+ }
+ }
+
private DataFetcherExceptionHandlerResult applyDefaultHandling(Throwable ex, DataFetchingEnvironment env) {
GraphQLError error = GraphqlErrorBuilder.newError(env)
.message(ex.getMessage())
diff --git a/spring-graphql/src/main/java/org/springframework/graphql/execution/SyncDataFetcherExceptionResolver.java b/spring-graphql/src/main/java/org/springframework/graphql/execution/SyncDataFetcherExceptionResolver.java
index e0cca317..7804e44f 100644
--- a/spring-graphql/src/main/java/org/springframework/graphql/execution/SyncDataFetcherExceptionResolver.java
+++ b/spring-graphql/src/main/java/org/springframework/graphql/execution/SyncDataFetcherExceptionResolver.java
@@ -21,7 +21,6 @@ import java.util.List;
import graphql.GraphQLError;
import graphql.schema.DataFetchingEnvironment;
import reactor.core.publisher.Mono;
-import reactor.util.context.ContextView;
/**
* {@link DataFetcherExceptionResolver} that resolves exceptions synchronously.
@@ -32,23 +31,16 @@ import reactor.util.context.ContextView;
public interface SyncDataFetcherExceptionResolver extends DataFetcherExceptionResolver {
@Override
- default Mono
> resolveException(Throwable exception, DataFetchingEnvironment environment) {
- ContextView contextView = ContextManager.getReactorContext(environment);
- try {
- ContextManager.restoreThreadLocalValues(contextView);
- return Mono.just(doResolveException(exception, environment));
- }
- finally {
- ContextManager.resetThreadLocalValues(contextView);
- }
+ default Mono
> resolveException(Throwable exception, DataFetchingEnvironment env) {
+ return Mono.just(doResolveException(exception, env));
}
/**
* Implement this method to resolve exceptions.
* @param exception the exception to resolve
- * @param environment the environment for the invoked {@code DataFetcher}
+ * @param env the environment for the invoked {@code DataFetcher}
* @return the list of resolved GraphQL errors
*/
- List