Skip to content

Commit d9a583a

Browse files
committed
Replace DataFetcher registrations with custom root type names
Closes gh-708
1 parent b84d521 commit d9a583a

File tree

2 files changed

+60
-8
lines changed

2 files changed

+60
-8
lines changed

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

+22
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import java.util.Arrays;
2323
import java.util.LinkedHashSet;
2424
import java.util.List;
25+
import java.util.Map;
2526
import java.util.Set;
2627
import java.util.function.BiFunction;
2728
import java.util.function.Consumer;
@@ -30,6 +31,7 @@
3031
import graphql.GraphQL;
3132
import graphql.language.InterfaceTypeDefinition;
3233
import graphql.language.UnionTypeDefinition;
34+
import graphql.schema.DataFetcher;
3335
import graphql.schema.GraphQLSchema;
3436
import graphql.schema.TypeResolver;
3537
import graphql.schema.idl.CombinedWiringFactory;
@@ -45,6 +47,8 @@
4547
import org.springframework.core.io.Resource;
4648
import org.springframework.lang.Nullable;
4749
import org.springframework.util.Assert;
50+
import org.springframework.util.CollectionUtils;
51+
import org.springframework.util.StringUtils;
4852

4953

5054
/**
@@ -149,6 +153,7 @@ protected GraphQLSchema initGraphQlSchema() {
149153
}
150154

151155
RuntimeWiring runtimeWiring = initRuntimeWiring();
156+
updateForCustomRootOperationTypeNames(registry, runtimeWiring);
152157

153158
TypeResolver typeResolver = initTypeResolver();
154159
registry.types().values().forEach((def) -> {
@@ -210,6 +215,23 @@ private RuntimeWiring initRuntimeWiring() {
210215
return builder.build();
211216
}
212217

218+
@SuppressWarnings("rawtypes")
219+
private static void updateForCustomRootOperationTypeNames(
220+
TypeDefinitionRegistry registry, RuntimeWiring runtimeWiring) {
221+
222+
if (registry.schemaDefinition().isEmpty()) {
223+
return;
224+
}
225+
226+
registry.schemaDefinition().get().getOperationTypeDefinitions().forEach((definition) -> {
227+
String name = StringUtils.capitalize(definition.getName());
228+
Map<String, DataFetcher> dataFetcherMap = runtimeWiring.getDataFetchers().remove(name);
229+
if (!CollectionUtils.isEmpty(dataFetcherMap)) {
230+
runtimeWiring.getDataFetchers().put(definition.getTypeName().getName(), dataFetcherMap);
231+
}
232+
});
233+
}
234+
213235
private TypeResolver initTypeResolver() {
214236
return (this.typeResolver != null) ? this.typeResolver : new ClassNameTypeResolver();
215237
}

spring-graphql/src/test/java/org/springframework/graphql/execution/DefaultSchemaResourceGraphQlSourceBuilderTests.java

+38-8
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2002-2022 the original author or authors.
2+
* Copyright 2002-2024 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -22,6 +22,7 @@
2222
import graphql.Scalars;
2323
import graphql.schema.DataFetcher;
2424
import graphql.schema.FieldCoordinates;
25+
import graphql.schema.GraphQLCodeRegistry;
2526
import graphql.schema.GraphQLFieldDefinition;
2627
import graphql.schema.GraphQLObjectType;
2728
import graphql.schema.GraphQLSchema;
@@ -78,13 +79,14 @@ public TraversalControl visitGraphQLObjectType(
7879
@Test
7980
void typeVisitorToTransformSchema() {
8081

81-
String schemaContent = "" +
82-
"type Query {" +
83-
" person: Person" +
84-
"} " +
85-
"type Person {" +
86-
" firstName: String" +
87-
"}";
82+
String schemaContent = """
83+
type Query {
84+
person: Person
85+
}
86+
type Person {
87+
firstName: String
88+
}
89+
""";
8890

8991
GraphQLTypeVisitor visitor = new GraphQLTypeVisitorStub() {
9092

@@ -113,6 +115,34 @@ public TraversalControl visitGraphQLObjectType(
113115
assertThat(schema.getObjectType("Person").getFieldDefinition("lastName")).isNotNull();
114116
}
115117

118+
@Test // gh-708
119+
void rootOperationTypesWithCustomNames() {
120+
String schemaContent = """
121+
schema {
122+
query: MyQuery
123+
mutation: MyMutation
124+
}
125+
type MyQuery {
126+
hello: String!
127+
}
128+
type MyMutation {
129+
saveGreeting(greeting: String!): String!
130+
}
131+
""";
132+
133+
GraphQLSchema schema = GraphQlSetup.schemaContent(schemaContent)
134+
.runtimeWiring(wiringBuilder -> {
135+
wiringBuilder.type("Query", builder -> builder.dataFetcher("hello", env -> ""));
136+
wiringBuilder.type("Mutation", builder -> builder.dataFetcher("saveGreeting", env -> ""));
137+
})
138+
.toGraphQlSource()
139+
.schema();
140+
141+
GraphQLCodeRegistry registry = schema.getCodeRegistry();
142+
assertThat(registry.hasDataFetcher(FieldCoordinates.coordinates("MyQuery", "hello"))).isTrue();
143+
assertThat(registry.hasDataFetcher(FieldCoordinates.coordinates("MyMutation", "saveGreeting"))).isTrue();
144+
}
145+
116146
@Test
117147
void wiringFactoryList() {
118148

0 commit comments

Comments
 (0)