3434import org .springframework .graphql .ExecutionGraphQlResponse ;
3535import org .springframework .graphql .ExecutionGraphQlService ;
3636import org .springframework .graphql .support .DefaultExecutionGraphQlResponse ;
37+ import org .springframework .lang .Nullable ;
3738import org .springframework .util .ClassUtils ;
3839import org .springframework .util .ReflectionUtils ;
3940
@@ -57,7 +58,8 @@ public class DefaultExecutionGraphQlService implements ExecutionGraphQlService {
5758
5859 private final List <DataLoaderRegistrar > dataLoaderRegistrars = new ArrayList <>();
5960
60- private boolean hasDataLoaderRegistrations ;
61+ @ Nullable
62+ private Boolean hasDataLoaderRegistrations ;
6163
6264 private final boolean isDefaultExecutionIdProvider ;
6365
@@ -80,13 +82,6 @@ public DefaultExecutionGraphQlService(GraphQlSource graphQlSource) {
8082 */
8183 public void addDataLoaderRegistrar (DataLoaderRegistrar registrar ) {
8284 this .dataLoaderRegistrars .add (registrar );
83- this .hasDataLoaderRegistrations = (this .hasDataLoaderRegistrations || hasRegistrations (registrar ));
84- }
85-
86- private static boolean hasRegistrations (DataLoaderRegistrar registrar ) {
87- DataLoaderRegistry registry = DataLoaderRegistry .newRegistry ().build ();
88- registrar .registerDataLoaders (registry , GraphQLContext .newContext ().build ());
89- return !registry .getDataLoaders ().isEmpty ();
9085 }
9186
9287
@@ -104,28 +99,41 @@ public final Mono<ExecutionGraphQlResponse> execute(ExecutionGraphQlRequest requ
10499 ContextSnapshotFactoryHelper .saveInstance (factory , graphQLContext );
105100 factory .captureFrom (contextView ).updateContext (graphQLContext );
106101
107- ExecutionInput updatedExecutionInput =
108- (this .hasDataLoaderRegistrations ? registerDataLoaders (executionInput ) : executionInput );
102+ ExecutionInput executionInputToUse = registerDataLoaders (executionInput );
109103
110- return Mono .fromFuture (this .graphQlSource .graphQl ().executeAsync (updatedExecutionInput ))
111- .map ((result ) -> new DefaultExecutionGraphQlResponse (updatedExecutionInput , result ));
104+ return Mono .fromFuture (this .graphQlSource .graphQl ().executeAsync (executionInputToUse ))
105+ .map ((result ) -> new DefaultExecutionGraphQlResponse (executionInputToUse , result ));
112106 });
113107 }
114108
115109 private ExecutionInput registerDataLoaders (ExecutionInput executionInput ) {
116- GraphQLContext graphQLContext = executionInput .getGraphQLContext ();
117- DataLoaderRegistry existingRegistry = executionInput .getDataLoaderRegistry ();
118- if (existingRegistry == this .emptyDataLoaderRegistryInstance ) {
119- DataLoaderRegistry newRegistry = DataLoaderRegistry .newRegistry ().build ();
120- applyDataLoaderRegistrars (newRegistry , graphQLContext );
121- executionInput = executionInput .transform ((builder ) -> builder .dataLoaderRegistry (newRegistry ));
110+ if (this .hasDataLoaderRegistrations == null ) {
111+ this .hasDataLoaderRegistrations = initHasDataLoaderRegistrations ();
122112 }
123- else {
124- applyDataLoaderRegistrars (existingRegistry , graphQLContext );
113+ if (this .hasDataLoaderRegistrations ) {
114+ GraphQLContext graphQLContext = executionInput .getGraphQLContext ();
115+ DataLoaderRegistry existingRegistry = executionInput .getDataLoaderRegistry ();
116+ if (existingRegistry == this .emptyDataLoaderRegistryInstance ) {
117+ DataLoaderRegistry newRegistry = DataLoaderRegistry .newRegistry ().build ();
118+ applyDataLoaderRegistrars (newRegistry , graphQLContext );
119+ executionInput = executionInput .transform ((builder ) -> builder .dataLoaderRegistry (newRegistry ));
120+ }
121+ else {
122+ applyDataLoaderRegistrars (existingRegistry , graphQLContext );
123+ }
125124 }
126125 return executionInput ;
127126 }
128127
128+ private boolean initHasDataLoaderRegistrations () {
129+ for (DataLoaderRegistrar registrar : this .dataLoaderRegistrars ) {
130+ if (registrar .hasRegistrations ()) {
131+ return true ;
132+ }
133+ }
134+ return false ;
135+ }
136+
129137 private void applyDataLoaderRegistrars (DataLoaderRegistry registry , GraphQLContext graphQLContext ) {
130138 this .dataLoaderRegistrars .forEach ((registrar ) -> registrar .registerDataLoaders (registry , graphQLContext ));
131139 }
0 commit comments