1616
1717package org .springframework .graphql .execution ;
1818
19+ import java .lang .reflect .Field ;
1920import java .util .ArrayList ;
2021import java .util .List ;
2122import java .util .function .BiFunction ;
3334import org .springframework .graphql .ExecutionGraphQlResponse ;
3435import org .springframework .graphql .ExecutionGraphQlService ;
3536import org .springframework .graphql .support .DefaultExecutionGraphQlResponse ;
37+ import org .springframework .util .ClassUtils ;
38+ import org .springframework .util .ReflectionUtils ;
3639
3740/**
3841 * {@link ExecutionGraphQlService} that uses a {@link GraphQlSource} to obtain a
4346 */
4447public class DefaultExecutionGraphQlService implements ExecutionGraphQlService {
4548
49+ private static final boolean belowGraphQlJava22 = ClassUtils .isPresent (
50+ DataLoaderRegistry21Initializer .CLASS_NAME , ExecutionGraphQlService .class .getClassLoader ());
51+
4652 private static final BiFunction <ExecutionInput , ExecutionInput .Builder , ExecutionInput > RESET_EXECUTION_ID_CONFIGURER =
4753 (executionInput , builder ) -> builder .executionId (null ).build ();
4854
@@ -55,11 +61,15 @@ public class DefaultExecutionGraphQlService implements ExecutionGraphQlService {
5561
5662 private final boolean isDefaultExecutionIdProvider ;
5763
64+ private final Object emptyDataLoaderRegistryInstance ;
65+
5866
5967 public DefaultExecutionGraphQlService (GraphQlSource graphQlSource ) {
6068 this .graphQlSource = graphQlSource ;
6169 this .isDefaultExecutionIdProvider =
6270 (graphQlSource .graphQl ().getIdProvider () == ExecutionIdProvider .DEFAULT_EXECUTION_ID_PROVIDER );
71+ this .emptyDataLoaderRegistryInstance = (belowGraphQlJava22 ) ?
72+ DataLoaderRegistry21Initializer .getInstance () : DataLoaderRegistry22Initializer .getInstance ();
6373 }
6474
6575
@@ -105,7 +115,7 @@ public final Mono<ExecutionGraphQlResponse> execute(ExecutionGraphQlRequest requ
105115 private ExecutionInput registerDataLoaders (ExecutionInput executionInput ) {
106116 GraphQLContext graphQLContext = executionInput .getGraphQLContext ();
107117 DataLoaderRegistry existingRegistry = executionInput .getDataLoaderRegistry ();
108- if (existingRegistry == EmptyDataLoaderRegistryInstance . EMPTY_DATALOADER_REGISTRY ) {
118+ if (existingRegistry == this . emptyDataLoaderRegistryInstance ) {
109119 DataLoaderRegistry newRegistry = DataLoaderRegistry .newRegistry ().build ();
110120 applyDataLoaderRegistrars (newRegistry , graphQLContext );
111121 executionInput = executionInput .transform ((builder ) -> builder .dataLoaderRegistry (newRegistry ));
@@ -120,4 +130,30 @@ private void applyDataLoaderRegistrars(DataLoaderRegistry registry, GraphQLConte
120130 this .dataLoaderRegistrars .forEach ((registrar ) -> registrar .registerDataLoaders (registry , graphQLContext ));
121131 }
122132
133+
134+ private static final class DataLoaderRegistry22Initializer {
135+
136+ public static Object getInstance () {
137+ return EmptyDataLoaderRegistryInstance .EMPTY_DATALOADER_REGISTRY ;
138+ }
139+ }
140+
141+
142+ private static final class DataLoaderRegistry21Initializer {
143+
144+ public static final String CLASS_NAME =
145+ "graphql.execution.instrumentation.dataloader.DataLoaderDispatcherInstrumentationState" ;
146+
147+ @ SuppressWarnings ("DataFlowIssue" )
148+ public static Object getInstance () {
149+ try {
150+ Field field = ReflectionUtils .findField (Class .forName (CLASS_NAME ), "EMPTY_DATALOADER_REGISTRY" );
151+ return ReflectionUtils .getField (field , null );
152+ }
153+ catch (ClassNotFoundException ex ) {
154+ throw new RuntimeException (ex );
155+ }
156+ }
157+ }
158+
123159}
0 commit comments