21
21
import graphql .ExecutionInput ;
22
22
import graphql .GraphQLContext ;
23
23
import graphql .TrivialDataFetcher ;
24
+ import graphql .execution .DataFetcherResult ;
24
25
import graphql .schema .DataFetcher ;
25
26
import graphql .schema .DataFetchingEnvironment ;
26
27
import graphql .schema .FieldCoordinates ;
39
40
import reactor .core .publisher .Mono ;
40
41
41
42
import org .springframework .graphql .ExecutionGraphQlRequest ;
43
+ import org .springframework .lang .Nullable ;
42
44
import org .springframework .util .Assert ;
43
45
44
46
/**
@@ -74,7 +76,6 @@ private ContextDataFetcherDecorator(
74
76
}
75
77
76
78
77
- @ SuppressWarnings ("ReactiveStreamsUnusedPublisher" )
78
79
@ Override
79
80
public Object get (DataFetchingEnvironment env ) throws Exception {
80
81
@@ -83,10 +84,33 @@ public Object get(DataFetchingEnvironment env) throws Exception {
83
84
ContextSnapshot snapshot = (env .getLocalContext () instanceof GraphQLContext localContext ) ?
84
85
snapshotFactory .captureFrom (graphQlContext , localContext ) :
85
86
snapshotFactory .captureFrom (graphQlContext );
87
+
86
88
Mono <Void > cancelledRequest = graphQlContext .get (ExecutionGraphQlRequest .CANCEL_PUBLISHER_CONTEXT_KEY );
87
89
88
90
Object value = snapshot .wrap (() -> this .delegate .get (env )).call ();
89
91
92
+ if (value instanceof DataFetcherResult <?> dataFetcherResult ) {
93
+ Object adapted = updateValue (dataFetcherResult .getData (), snapshot , cancelledRequest );
94
+ value = DataFetcherResult .newResult ()
95
+ .data (adapted )
96
+ .errors (dataFetcherResult .getErrors ())
97
+ .localContext (dataFetcherResult .getLocalContext ()).build ();
98
+ }
99
+ else {
100
+ value = updateValue (value , snapshot , cancelledRequest );
101
+ }
102
+
103
+ return value ;
104
+ }
105
+
106
+ @ SuppressWarnings ("ReactiveStreamsUnusedPublisher" )
107
+ private @ Nullable Object updateValue (
108
+ @ Nullable Object value , ContextSnapshot snapshot , @ Nullable Mono <Void > cancelledRequest ) {
109
+
110
+ if (value == null ) {
111
+ return null ;
112
+ }
113
+
90
114
if (this .subscription ) {
91
115
Flux <?> subscriptionResult = ReactiveAdapterRegistryHelper .toSubscriptionFlux (value )
92
116
.onErrorResume ((exception ) -> {
0 commit comments