Skip to content

Commit a323d22

Browse files
committed
Fix GraphQL Java 21 compatibility issue
Closes gh-963
1 parent 0ab80ee commit a323d22

File tree

1 file changed

+37
-1
lines changed

1 file changed

+37
-1
lines changed

spring-graphql/src/main/java/org/springframework/graphql/execution/DefaultExecutionGraphQlService.java

+37-1
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
package org.springframework.graphql.execution;
1818

19+
import java.lang.reflect.Field;
1920
import java.util.ArrayList;
2021
import java.util.List;
2122
import java.util.function.BiFunction;
@@ -33,6 +34,8 @@
3334
import org.springframework.graphql.ExecutionGraphQlResponse;
3435
import org.springframework.graphql.ExecutionGraphQlService;
3536
import 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
@@ -43,6 +46,9 @@
4346
*/
4447
public 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

Comments
 (0)