diff --git a/spring-graphql/src/main/java/org/springframework/graphql/data/method/annotation/support/AnnotatedControllerConfigurer.java b/spring-graphql/src/main/java/org/springframework/graphql/data/method/annotation/support/AnnotatedControllerConfigurer.java index b0d526cb..07386a78 100644 --- a/spring-graphql/src/main/java/org/springframework/graphql/data/method/annotation/support/AnnotatedControllerConfigurer.java +++ b/spring-graphql/src/main/java/org/springframework/graphql/data/method/annotation/support/AnnotatedControllerConfigurer.java @@ -32,6 +32,7 @@ import javax.validation.Validator; import graphql.schema.DataFetcher; import graphql.schema.DataFetchingEnvironment; import graphql.schema.FieldCoordinates; +import graphql.schema.GraphQLCodeRegistry; import graphql.schema.idl.RuntimeWiring; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -72,6 +73,10 @@ import org.springframework.util.StringUtils; * annotated handler methods in {@link Controller @Controller} classes and * registers them as {@link DataFetcher}s. * + *

In addition to initializing a {@link RuntimeWiring.Builder}, this class, also + * provides an option to {@link #configure(GraphQLCodeRegistry.Builder) configure} + * data fetchers on a {@link GraphQLCodeRegistry.Builder}. + * * @author Rossen Stoyanchev * @author Brian Clozel * @since 1.0.0 @@ -185,7 +190,7 @@ public class AnnotatedControllerConfigurer } @Override - public void configure(RuntimeWiring.Builder builder) { + public void configure(RuntimeWiring.Builder runtimeWiringBuilder) { Assert.state(this.argumentResolvers != null, "`argumentResolvers` is not initialized"); findHandlerMethods().forEach((info) -> { @@ -197,7 +202,7 @@ public class AnnotatedControllerConfigurer String dataLoaderKey = registerBatchLoader(info); dataFetcher = new BatchMappingDataFetcher(dataLoaderKey); } - builder.type(info.getCoordinates().getTypeName(), typeBuilder -> + runtimeWiringBuilder.type(info.getCoordinates().getTypeName(), typeBuilder -> typeBuilder.dataFetcher(info.getCoordinates().getFieldName(), dataFetcher)); }); } @@ -372,6 +377,26 @@ public class AnnotatedControllerConfigurer return dataLoaderKey; } + /** + * Alternative to {@link #configure(RuntimeWiring.Builder)} that registers + * data fetchers in a {@link GraphQLCodeRegistry.Builder}. This could be + * used with programmatic creation of {@link graphql.schema.GraphQLSchema}. + */ + @SuppressWarnings("rawtypes") + public void configure(GraphQLCodeRegistry.Builder codeRegistryBuilder) { + + RuntimeWiring.Builder wiringBuilder = RuntimeWiring.newRuntimeWiring(); + configure(wiringBuilder); + RuntimeWiring runtimeWiring = wiringBuilder.build(); + + runtimeWiring.getDataFetchers().forEach((typeName, dataFetcherMap) -> { + dataFetcherMap.forEach((key, value) -> { + FieldCoordinates coordinates = FieldCoordinates.coordinates(typeName, key); + codeRegistryBuilder.dataFetcher(coordinates, (DataFetcher) value); + }); + }); + } + private static class MappingInfo {