From 3567a062ab6b11cc8c77442cafb3d3fb26b66875 Mon Sep 17 00:00:00 2001 From: Rossen Stoyanchev Date: Fri, 6 Aug 2021 17:51:07 +0100 Subject: [PATCH] Add RuntimeWiringConfigurer Closes gh-107 --- .../boot/GraphQlAutoConfiguration.java | 5 +++-- .../boot/GraphQlWebFluxAutoConfiguration.java | 11 +++------- .../boot/GraphQlWebMvcAutoConfiguration.java | 11 +++------- .../GraphQlWebFluxAutoConfigurationTests.java | 7 +++--- .../GraphQlWebMvcAutoConfigurationTests.java | 8 ++++--- ...WebFluxSecurityAutoConfigurationTests.java | 9 ++++---- ...lWebMvcSecurityAutoConfigurationTests.java | 9 ++++---- .../src/docs/asciidoc/boot-starter.adoc | 6 ++--- ...va => AnnotatedDataFetcherConfigurer.java} | 13 +++++++---- .../DefaultGraphQlSourceBuilder.java | 15 ++++++------- .../graphql/execution/GraphQlSource.java | 13 +++++------ .../execution/RuntimeWiringConfigurer.java | 22 +++++++++---------- .../graphql/GraphQlTestUtils.java | 2 +- ... AnnotatedDataFetcherConfigurerTests.java} | 14 ++++++------ .../AnnotatedDataFetcherInvocationTests.java | 10 ++++----- .../querydsl/QuerydslDataFetcherTests.java | 2 +- .../graphql/web/BookTestUtils.java | 2 +- 17 files changed, 78 insertions(+), 81 deletions(-) rename spring-graphql/src/main/java/org/springframework/graphql/data/method/{AnnotatedDataFetcherRegistrar.java => AnnotatedDataFetcherConfigurer.java} (96%) rename graphql-spring-boot-starter/src/main/java/org/springframework/graphql/boot/RuntimeWiringBuilderCustomizer.java => spring-graphql/src/main/java/org/springframework/graphql/execution/RuntimeWiringConfigurer.java (54%) rename spring-graphql/src/test/java/org/springframework/graphql/data/method/{AnnotatedDataFetcherRegistrarTests.java => AnnotatedDataFetcherConfigurerTests.java} (93%) diff --git a/graphql-spring-boot-starter/src/main/java/org/springframework/graphql/boot/GraphQlAutoConfiguration.java b/graphql-spring-boot-starter/src/main/java/org/springframework/graphql/boot/GraphQlAutoConfiguration.java index b53ac495..778c10e4 100644 --- a/graphql-spring-boot-starter/src/main/java/org/springframework/graphql/boot/GraphQlAutoConfiguration.java +++ b/graphql-spring-boot-starter/src/main/java/org/springframework/graphql/boot/GraphQlAutoConfiguration.java @@ -36,6 +36,7 @@ import org.springframework.core.io.Resource; import org.springframework.core.io.support.ResourcePatternResolver; import org.springframework.graphql.execution.DataFetcherExceptionResolver; import org.springframework.graphql.execution.GraphQlSource; +import org.springframework.graphql.execution.RuntimeWiringConfigurer; /** * {@link EnableAutoConfiguration Auto-configuration} for creating a @@ -57,14 +58,14 @@ public class GraphQlAutoConfiguration { ObjectProvider exceptionResolversProvider, ObjectProvider instrumentationsProvider, ObjectProvider sourceCustomizers, - ObjectProvider wiringCustomizers) throws IOException { + ObjectProvider wiringConfigurers) throws IOException { List schemaResources = resolveSchemaResources(resourcePatternResolver, properties.getSchema().getLocations()); GraphQlSource.Builder builder = GraphQlSource.builder() .schemaResources(schemaResources.toArray(new Resource[0])) .exceptionResolvers(exceptionResolversProvider.orderedStream().collect(Collectors.toList())) .instrumentation(instrumentationsProvider.orderedStream().collect(Collectors.toList())); - wiringCustomizers.orderedStream().forEach((customizer) -> builder.configureRuntimeWiring(customizer::customize)); + wiringConfigurers.orderedStream().forEach(builder::runtimeWiringConfigurer); sourceCustomizers.orderedStream().forEach((customizer) -> customizer.customize(builder)); return builder.build(); } diff --git a/graphql-spring-boot-starter/src/main/java/org/springframework/graphql/boot/GraphQlWebFluxAutoConfiguration.java b/graphql-spring-boot-starter/src/main/java/org/springframework/graphql/boot/GraphQlWebFluxAutoConfiguration.java index dfbd1c8b..955b8cd5 100644 --- a/graphql-spring-boot-starter/src/main/java/org/springframework/graphql/boot/GraphQlWebFluxAutoConfiguration.java +++ b/graphql-spring-boot-starter/src/main/java/org/springframework/graphql/boot/GraphQlWebFluxAutoConfiguration.java @@ -36,7 +36,7 @@ import org.springframework.context.annotation.Configuration; import org.springframework.core.io.Resource; import org.springframework.core.io.ResourceLoader; import org.springframework.graphql.GraphQlService; -import org.springframework.graphql.data.method.AnnotatedDataFetcherRegistrar; +import org.springframework.graphql.data.method.AnnotatedDataFetcherConfigurer; import org.springframework.graphql.execution.GraphQlSource; import org.springframework.graphql.web.WebGraphQlHandler; import org.springframework.graphql.web.WebInterceptor; @@ -75,17 +75,12 @@ public class GraphQlWebFluxAutoConfiguration { private static final Log logger = LogFactory.getLog(GraphQlWebFluxAutoConfiguration.class); @Bean - public AnnotatedDataFetcherRegistrar dataFetcherRegistrar(ServerCodecConfigurer configurer) { - AnnotatedDataFetcherRegistrar registrar = new AnnotatedDataFetcherRegistrar(); + public AnnotatedDataFetcherConfigurer annotatedDataFetcherConfigurer(ServerCodecConfigurer configurer) { + AnnotatedDataFetcherConfigurer registrar = new AnnotatedDataFetcherConfigurer(); registrar.setServerCodecConfigurer(configurer); return registrar; } - @Bean - public RuntimeWiringBuilderCustomizer annotatedDataFetcherRuntimeWiringCustomizer(AnnotatedDataFetcherRegistrar registrar) { - return registrar::register; - } - @Bean @ConditionalOnBean(GraphQlService.class) @ConditionalOnMissingBean diff --git a/graphql-spring-boot-starter/src/main/java/org/springframework/graphql/boot/GraphQlWebMvcAutoConfiguration.java b/graphql-spring-boot-starter/src/main/java/org/springframework/graphql/boot/GraphQlWebMvcAutoConfiguration.java index 48b28568..0c211fd2 100644 --- a/graphql-spring-boot-starter/src/main/java/org/springframework/graphql/boot/GraphQlWebMvcAutoConfiguration.java +++ b/graphql-spring-boot-starter/src/main/java/org/springframework/graphql/boot/GraphQlWebMvcAutoConfiguration.java @@ -40,7 +40,7 @@ import org.springframework.context.annotation.Configuration; import org.springframework.core.io.Resource; import org.springframework.core.io.ResourceLoader; import org.springframework.graphql.GraphQlService; -import org.springframework.graphql.data.method.AnnotatedDataFetcherRegistrar; +import org.springframework.graphql.data.method.AnnotatedDataFetcherConfigurer; import org.springframework.graphql.execution.GraphQlSource; import org.springframework.graphql.execution.ThreadLocalAccessor; import org.springframework.graphql.web.WebGraphQlHandler; @@ -83,8 +83,8 @@ public class GraphQlWebMvcAutoConfiguration { @Bean - public AnnotatedDataFetcherRegistrar dataFetcherRegistrar(HttpMessageConverters converters) { - AnnotatedDataFetcherRegistrar registrar = new AnnotatedDataFetcherRegistrar(); + public AnnotatedDataFetcherConfigurer annotatedDataFetcherConfigurer(HttpMessageConverters converters) { + AnnotatedDataFetcherConfigurer registrar = new AnnotatedDataFetcherConfigurer(); registrar.setJsonMessageConverter(getJsonConverter(converters)); return registrar; } @@ -98,11 +98,6 @@ public class GraphQlWebMvcAutoConfiguration { .orElseThrow(() -> new IllegalStateException("No JSON converter")); } - @Bean - public RuntimeWiringBuilderCustomizer annotatedDataFetcherRuntimeWiringCustomizer(AnnotatedDataFetcherRegistrar registrar) { - return registrar::register; - } - @Bean @ConditionalOnBean(GraphQlService.class) @ConditionalOnMissingBean diff --git a/graphql-spring-boot-starter/src/test/java/org/springframework/graphql/boot/GraphQlWebFluxAutoConfigurationTests.java b/graphql-spring-boot-starter/src/test/java/org/springframework/graphql/boot/GraphQlWebFluxAutoConfigurationTests.java index 05b65525..1f98acb5 100644 --- a/graphql-spring-boot-starter/src/test/java/org/springframework/graphql/boot/GraphQlWebFluxAutoConfigurationTests.java +++ b/graphql-spring-boot-starter/src/test/java/org/springframework/graphql/boot/GraphQlWebFluxAutoConfigurationTests.java @@ -30,6 +30,7 @@ import org.springframework.boot.autoconfigure.web.reactive.WebFluxAutoConfigurat import org.springframework.boot.test.context.runner.ReactiveWebApplicationContextRunner; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.graphql.execution.RuntimeWiringConfigurer; import org.springframework.graphql.web.WebInterceptor; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; @@ -161,9 +162,9 @@ class GraphQlWebFluxAutoConfigurationTests { static class DataFetchersConfiguration { @Bean - RuntimeWiringBuilderCustomizer bookDataFetcher() { - return (runtimeWiring) -> - runtimeWiring.type(TypeRuntimeWiring.newTypeWiring("Query") + RuntimeWiringConfigurer bookDataFetcher() { + return (builder) -> builder.type( + TypeRuntimeWiring.newTypeWiring("Query") .dataFetcher("bookById", GraphQlDataFetchers.getBookByIdDataFetcher())); } diff --git a/graphql-spring-boot-starter/src/test/java/org/springframework/graphql/boot/GraphQlWebMvcAutoConfigurationTests.java b/graphql-spring-boot-starter/src/test/java/org/springframework/graphql/boot/GraphQlWebMvcAutoConfigurationTests.java index 102b6c31..838fc87b 100644 --- a/graphql-spring-boot-starter/src/test/java/org/springframework/graphql/boot/GraphQlWebMvcAutoConfigurationTests.java +++ b/graphql-spring-boot-starter/src/test/java/org/springframework/graphql/boot/GraphQlWebMvcAutoConfigurationTests.java @@ -28,6 +28,7 @@ import org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguratio import org.springframework.boot.test.context.runner.WebApplicationContextRunner; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.graphql.execution.RuntimeWiringConfigurer; import org.springframework.graphql.web.WebInterceptor; import org.springframework.http.MediaType; import org.springframework.test.web.servlet.MockMvc; @@ -147,9 +148,10 @@ class GraphQlWebMvcAutoConfigurationTests { static class DataFetchersConfiguration { @Bean - RuntimeWiringBuilderCustomizer bookDataFetcher() { - return (builder) -> builder.type(TypeRuntimeWiring.newTypeWiring("Query") - .dataFetcher("bookById", GraphQlDataFetchers.getBookByIdDataFetcher())); + RuntimeWiringConfigurer bookDataFetcher() { + return (builder) -> builder.type( + TypeRuntimeWiring.newTypeWiring("Query") + .dataFetcher("bookById", GraphQlDataFetchers.getBookByIdDataFetcher())); } } diff --git a/graphql-spring-boot-starter/src/test/java/org/springframework/graphql/boot/security/GraphQlWebFluxSecurityAutoConfigurationTests.java b/graphql-spring-boot-starter/src/test/java/org/springframework/graphql/boot/security/GraphQlWebFluxSecurityAutoConfigurationTests.java index f61a8b85..dcd92526 100644 --- a/graphql-spring-boot-starter/src/test/java/org/springframework/graphql/boot/security/GraphQlWebFluxSecurityAutoConfigurationTests.java +++ b/graphql-spring-boot-starter/src/test/java/org/springframework/graphql/boot/security/GraphQlWebFluxSecurityAutoConfigurationTests.java @@ -37,8 +37,8 @@ import org.springframework.graphql.boot.GraphQlAutoConfiguration; import org.springframework.graphql.boot.GraphQlDataFetchers; import org.springframework.graphql.boot.GraphQlServiceAutoConfiguration; import org.springframework.graphql.boot.GraphQlWebFluxAutoConfiguration; -import org.springframework.graphql.boot.RuntimeWiringBuilderCustomizer; import org.springframework.graphql.execution.ErrorType; +import org.springframework.graphql.execution.RuntimeWiringConfigurer; import org.springframework.graphql.security.ReactiveSecurityDataFetcherExceptionResolver; import org.springframework.http.MediaType; import org.springframework.lang.Nullable; @@ -143,9 +143,10 @@ class GraphQlWebFluxSecurityAutoConfigurationTests { static class DataFetchersConfiguration { @Bean - RuntimeWiringBuilderCustomizer bookDataFetcher(BookService bookService) { - return (builder) -> builder.type(TypeRuntimeWiring.newTypeWiring("Query") - .dataFetcher("bookById", environment -> bookService.getBookdById(environment.getArgument("id")))); + RuntimeWiringConfigurer bookDataFetcher(BookService bookService) { + return (builder) -> builder.type( + TypeRuntimeWiring.newTypeWiring("Query") + .dataFetcher("bookById", env -> bookService.getBookdById(env.getArgument("id")))); } @Bean diff --git a/graphql-spring-boot-starter/src/test/java/org/springframework/graphql/boot/security/GraphQlWebMvcSecurityAutoConfigurationTests.java b/graphql-spring-boot-starter/src/test/java/org/springframework/graphql/boot/security/GraphQlWebMvcSecurityAutoConfigurationTests.java index 29043618..9de3e4b2 100644 --- a/graphql-spring-boot-starter/src/test/java/org/springframework/graphql/boot/security/GraphQlWebMvcSecurityAutoConfigurationTests.java +++ b/graphql-spring-boot-starter/src/test/java/org/springframework/graphql/boot/security/GraphQlWebMvcSecurityAutoConfigurationTests.java @@ -33,8 +33,8 @@ import org.springframework.graphql.boot.GraphQlAutoConfiguration; import org.springframework.graphql.boot.GraphQlDataFetchers; import org.springframework.graphql.boot.GraphQlServiceAutoConfiguration; import org.springframework.graphql.boot.GraphQlWebMvcAutoConfiguration; -import org.springframework.graphql.boot.RuntimeWiringBuilderCustomizer; import org.springframework.graphql.execution.ErrorType; +import org.springframework.graphql.execution.RuntimeWiringConfigurer; import org.springframework.graphql.security.SecurityContextThreadLocalAccessor; import org.springframework.graphql.security.SecurityDataFetcherExceptionResolver; import org.springframework.http.MediaType; @@ -148,9 +148,10 @@ class GraphQlWebMvcSecurityAutoConfigurationTests { static class DataFetchersConfiguration { @Bean - RuntimeWiringBuilderCustomizer bookDataFetcher(BookService bookService) { - return (builder) -> builder.type(TypeRuntimeWiring.newTypeWiring("Query") - .dataFetcher("bookById", environment -> bookService.getBookdById(environment.getArgument("id")))); + RuntimeWiringConfigurer bookDataFetcher(BookService bookService) { + return (builder) -> builder.type( + TypeRuntimeWiring.newTypeWiring("Query") + .dataFetcher("bookById", env -> bookService.getBookdById(env.getArgument("id")))); } @Bean diff --git a/spring-graphql-docs/src/docs/asciidoc/boot-starter.adoc b/spring-graphql-docs/src/docs/asciidoc/boot-starter.adoc index 392b04cc..b94c98d6 100644 --- a/spring-graphql-docs/src/docs/asciidoc/boot-starter.adoc +++ b/spring-graphql-docs/src/docs/asciidoc/boot-starter.adoc @@ -116,13 +116,13 @@ spring.graphql.schema.printer.enabled=false [[boot-graphql-datafetcher]] == `DataFetcher` Registration -You can declare `RuntimeWiringBuilderCustomizer` beans in your Spring config and use those to +You can declare `RuntimeWiringConfigurer` beans in your Spring config and use those to register data fetchers, type resolvers, and more with the GraphQL engine: [source,java,indent=0,subs="verbatim,quotes"] ---- @Component -public class PersonDataWiring implements RuntimeWiringBuilderCustomizer { +public class PersonDataWiring implements RuntimeWiringConfigurer { private final PersonService service; @@ -131,7 +131,7 @@ public class PersonDataWiring implements RuntimeWiringBuilderCustomizer { } @Override - public void customize(RuntimeWiring.Builder builder) { + public void configure(RuntimeWiring.Builder builder) { builder.type("Query", wiring -> wiring.dataFetcher("people", env -> this.service.findAll())); } diff --git a/spring-graphql/src/main/java/org/springframework/graphql/data/method/AnnotatedDataFetcherRegistrar.java b/spring-graphql/src/main/java/org/springframework/graphql/data/method/AnnotatedDataFetcherConfigurer.java similarity index 96% rename from spring-graphql/src/main/java/org/springframework/graphql/data/method/AnnotatedDataFetcherRegistrar.java rename to spring-graphql/src/main/java/org/springframework/graphql/data/method/AnnotatedDataFetcherConfigurer.java index 9107045b..88fa42e3 100644 --- a/spring-graphql/src/main/java/org/springframework/graphql/data/method/AnnotatedDataFetcherRegistrar.java +++ b/spring-graphql/src/main/java/org/springframework/graphql/data/method/AnnotatedDataFetcherConfigurer.java @@ -49,6 +49,7 @@ import org.springframework.graphql.data.method.annotation.SubscriptionMapping; import org.springframework.graphql.data.method.annotation.support.InputArgumentMethodArgumentResolver; import org.springframework.graphql.data.method.annotation.support.DataFetchingEnvironmentMethodArgumentResolver; import org.springframework.graphql.data.method.annotation.support.SourceMethodArgumentResolver; +import org.springframework.graphql.execution.RuntimeWiringConfigurer; import org.springframework.http.MediaType; import org.springframework.http.codec.DecoderHttpMessageReader; import org.springframework.http.codec.EncoderHttpMessageWriter; @@ -60,14 +61,17 @@ import org.springframework.util.ClassUtils; import org.springframework.util.StringUtils; /** - * + * A {@link RuntimeWiringConfigurer} that detects {@link SchemaMapping @SchemaMapping} + * annotated handler methods in {@link GraphQlController @GraphQlController} + * classes and registers them as {@link DataFetcher}s. * * @author Rossen Stoyanchev * @since 1.0.0 */ -public class AnnotatedDataFetcherRegistrar implements ApplicationContextAware, InitializingBean { +public class AnnotatedDataFetcherConfigurer + implements ApplicationContextAware, InitializingBean, RuntimeWiringConfigurer { - private final static Log logger = LogFactory.getLog(AnnotatedDataFetcherRegistrar.class); + private final static Log logger = LogFactory.getLog(AnnotatedDataFetcherConfigurer.class); /** @@ -175,7 +179,8 @@ public class AnnotatedDataFetcherRegistrar implements ApplicationContextAware, I } - public void register(RuntimeWiring.Builder builder) { + @Override + public void configure(RuntimeWiring.Builder builder) { Assert.state(this.argumentResolvers != null, "`argumentResolvers` not initialized"); Assert.state(this.applicationContext != null, "ApplicationContext is required"); diff --git a/spring-graphql/src/main/java/org/springframework/graphql/execution/DefaultGraphQlSourceBuilder.java b/spring-graphql/src/main/java/org/springframework/graphql/execution/DefaultGraphQlSourceBuilder.java index b07abf2e..6cbb2bcb 100644 --- a/spring-graphql/src/main/java/org/springframework/graphql/execution/DefaultGraphQlSourceBuilder.java +++ b/spring-graphql/src/main/java/org/springframework/graphql/execution/DefaultGraphQlSourceBuilder.java @@ -51,8 +51,7 @@ class DefaultGraphQlSourceBuilder implements GraphQlSource.Builder { private final List schemaResources = new ArrayList<>(); - private Consumer runtimeWiringConfigurers = (builder) -> { - }; + private final List runtimeWiringConfigurers = new ArrayList<>(); private final List exceptionResolvers = new ArrayList<>(); @@ -71,9 +70,8 @@ class DefaultGraphQlSourceBuilder implements GraphQlSource.Builder { } @Override - public GraphQlSource.Builder configureRuntimeWiring(Consumer configurer) { - Assert.notNull(configurer, "RuntimeWiring configurer is required"); - this.runtimeWiringConfigurers = this.runtimeWiringConfigurers.andThen(configurer); + public GraphQlSource.Builder runtimeWiringConfigurer(RuntimeWiringConfigurer configurer) { + this.runtimeWiringConfigurers.add(configurer); return this; } @@ -107,9 +105,10 @@ class DefaultGraphQlSourceBuilder implements GraphQlSource.Builder { .map(this::parseSchemaResource).reduce(TypeDefinitionRegistry::merge) .orElseThrow(() -> new IllegalArgumentException("'schemaResources' should not be empty")); - RuntimeWiring.Builder runtimeWiring = RuntimeWiring.newRuntimeWiring(); - this.runtimeWiringConfigurers.accept(runtimeWiring); - GraphQLSchema schema = new SchemaGenerator().makeExecutableSchema(registry, runtimeWiring.build()); + RuntimeWiring.Builder runtimeWiringBuilder = RuntimeWiring.newRuntimeWiring(); + this.runtimeWiringConfigurers.forEach(configurer -> configurer.configure(runtimeWiringBuilder)); + + GraphQLSchema schema = new SchemaGenerator().makeExecutableSchema(registry, runtimeWiringBuilder.build()); schema = applyTypeVisitors(schema); GraphQL.Builder builder = GraphQL.newGraphQL(schema); diff --git a/spring-graphql/src/main/java/org/springframework/graphql/execution/GraphQlSource.java b/spring-graphql/src/main/java/org/springframework/graphql/execution/GraphQlSource.java index dd2262db..2cda627a 100644 --- a/spring-graphql/src/main/java/org/springframework/graphql/execution/GraphQlSource.java +++ b/spring-graphql/src/main/java/org/springframework/graphql/execution/GraphQlSource.java @@ -79,15 +79,14 @@ public interface GraphQlSource { Builder schemaResources(Resource... resources); /** - * Configure consumers that will be given access to the {@link RuntimeWiring.Builder} used to - * build the {@link RuntimeWiring}. A {@link RuntimeWiring#newRuntimeWiring() default builder} - * instance is created as a starting point. - * @param configurer the runtime wiring configurer + * Add a component that is given access to the {@link RuntimeWiring.Builder} + * used to register {@link graphql.schema.DataFetcher}s, custom scalar + * types, type resolvers, and more. + * @param configurer the configurer to apply * @return the current builder - * @see graphql.schema.idl.SchemaGenerator#makeExecutableSchema(TypeDefinitionRegistry, - * RuntimeWiring) + * @see graphql.schema.idl.SchemaGenerator#makeExecutableSchema(TypeDefinitionRegistry, RuntimeWiring) */ - Builder configureRuntimeWiring(Consumer configurer); + Builder runtimeWiringConfigurer(RuntimeWiringConfigurer configurer); /** * Add {@link DataFetcherExceptionResolver}'s to use for resolving exceptions from diff --git a/graphql-spring-boot-starter/src/main/java/org/springframework/graphql/boot/RuntimeWiringBuilderCustomizer.java b/spring-graphql/src/main/java/org/springframework/graphql/execution/RuntimeWiringConfigurer.java similarity index 54% rename from graphql-spring-boot-starter/src/main/java/org/springframework/graphql/boot/RuntimeWiringBuilderCustomizer.java rename to spring-graphql/src/main/java/org/springframework/graphql/execution/RuntimeWiringConfigurer.java index 48e081fe..b379f61c 100644 --- a/graphql-spring-boot-starter/src/main/java/org/springframework/graphql/boot/RuntimeWiringBuilderCustomizer.java +++ b/spring-graphql/src/main/java/org/springframework/graphql/execution/RuntimeWiringConfigurer.java @@ -1,5 +1,5 @@ /* - * Copyright 2020-2021 the original author or authors. + * Copyright 2002-2021 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -13,26 +13,24 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - -package org.springframework.graphql.boot; +package org.springframework.graphql.execution; import graphql.schema.idl.RuntimeWiring; /** - * Callback interface that can be implemented by beans wishing to customize the - * {@link RuntimeWiring} via a {@link RuntimeWiring.Builder} whilst retaining default - * auto-configuration. + * Component used to apply changes to the {@link RuntimeWiring.Builder} instance + * used in {@link GraphQlSource.Builder}. * - * @author Brian Clozel + * @author Rossen Stoyanchev * @since 1.0.0 */ -@FunctionalInterface -public interface RuntimeWiringBuilderCustomizer { +public interface RuntimeWiringConfigurer { /** - * Customize the {@link RuntimeWiring.Builder} instance. - * @param builder builder the builder to customize + * Apply changes to the {@link RuntimeWiring.Builder} such as registering + * {@link graphql.schema.DataFetcher}s, custom scalar types, and more. + * @param builder the builder to configure */ - void customize(RuntimeWiring.Builder builder); + void configure(RuntimeWiring.Builder builder); } diff --git a/spring-graphql/src/test/java/org/springframework/graphql/GraphQlTestUtils.java b/spring-graphql/src/test/java/org/springframework/graphql/GraphQlTestUtils.java index 5c62d807..bf3bf454 100644 --- a/spring-graphql/src/test/java/org/springframework/graphql/GraphQlTestUtils.java +++ b/spring-graphql/src/test/java/org/springframework/graphql/GraphQlTestUtils.java @@ -54,7 +54,7 @@ public abstract class GraphQlTestUtils { return GraphQlSource.builder() .schemaResources(new ByteArrayResource(schemaContent.getBytes(StandardCharsets.UTF_8))) - .configureRuntimeWiring(wiring -> wiring.type(typeName, (builder) -> builder.dataFetcher(fieldName, fetcher))); + .runtimeWiringConfigurer(wiring -> wiring.type(typeName, (builder) -> builder.dataFetcher(fieldName, fetcher))); } } diff --git a/spring-graphql/src/test/java/org/springframework/graphql/data/method/AnnotatedDataFetcherRegistrarTests.java b/spring-graphql/src/test/java/org/springframework/graphql/data/method/AnnotatedDataFetcherConfigurerTests.java similarity index 93% rename from spring-graphql/src/test/java/org/springframework/graphql/data/method/AnnotatedDataFetcherRegistrarTests.java rename to spring-graphql/src/test/java/org/springframework/graphql/data/method/AnnotatedDataFetcherConfigurerTests.java index b076d088..5fee1ae1 100644 --- a/spring-graphql/src/test/java/org/springframework/graphql/data/method/AnnotatedDataFetcherRegistrarTests.java +++ b/spring-graphql/src/test/java/org/springframework/graphql/data/method/AnnotatedDataFetcherConfigurerTests.java @@ -37,10 +37,10 @@ import org.springframework.http.converter.json.MappingJackson2HttpMessageConvert import static org.assertj.core.api.Assertions.assertThat; /** - * Unit tests for {@link AnnotatedDataFetcherRegistrar}. + * Unit tests for {@link AnnotatedDataFetcherConfigurer}. * @author Rossen Stoyanchev */ -public class AnnotatedDataFetcherRegistrarTests { +public class AnnotatedDataFetcherConfigurerTests { @Test void registerWithDefaultCoordinates() { @@ -81,13 +81,13 @@ public class AnnotatedDataFetcherRegistrarTests { appContext.registerBean(handlerType); appContext.refresh(); - AnnotatedDataFetcherRegistrar registrar = new AnnotatedDataFetcherRegistrar(); - registrar.setJsonMessageConverter(new MappingJackson2HttpMessageConverter()); - registrar.setApplicationContext(appContext); - registrar.afterPropertiesSet(); + AnnotatedDataFetcherConfigurer configurer = new AnnotatedDataFetcherConfigurer(); + configurer.setJsonMessageConverter(new MappingJackson2HttpMessageConverter()); + configurer.setApplicationContext(appContext); + configurer.afterPropertiesSet(); RuntimeWiring.Builder wiringBuilder = RuntimeWiring.newRuntimeWiring(); - registrar.register(wiringBuilder); + configurer.configure(wiringBuilder); return wiringBuilder; } diff --git a/spring-graphql/src/test/java/org/springframework/graphql/data/method/AnnotatedDataFetcherInvocationTests.java b/spring-graphql/src/test/java/org/springframework/graphql/data/method/AnnotatedDataFetcherInvocationTests.java index 568978a0..40cf321b 100644 --- a/spring-graphql/src/test/java/org/springframework/graphql/data/method/AnnotatedDataFetcherInvocationTests.java +++ b/spring-graphql/src/test/java/org/springframework/graphql/data/method/AnnotatedDataFetcherInvocationTests.java @@ -180,14 +180,14 @@ public class AnnotatedDataFetcherInvocationTests { applicationContext.registerBean(beanClass); applicationContext.refresh(); - AnnotatedDataFetcherRegistrar registrar = new AnnotatedDataFetcherRegistrar(); - registrar.setApplicationContext(applicationContext); - registrar.setServerCodecConfigurer(ServerCodecConfigurer.create()); - registrar.afterPropertiesSet(); + AnnotatedDataFetcherConfigurer configurer = new AnnotatedDataFetcherConfigurer(); + configurer.setApplicationContext(applicationContext); + configurer.setServerCodecConfigurer(ServerCodecConfigurer.create()); + configurer.afterPropertiesSet(); GraphQlSource graphQlSource = GraphQlSource.builder() .schemaResources(new ClassPathResource("books/schema.graphqls")) - .configureRuntimeWiring(registrar::register) + .runtimeWiringConfigurer(configurer::configure) .build(); return graphQlSource.graphQl(); diff --git a/spring-graphql/src/test/java/org/springframework/graphql/data/querydsl/QuerydslDataFetcherTests.java b/spring-graphql/src/test/java/org/springframework/graphql/data/querydsl/QuerydslDataFetcherTests.java index b20fd82f..8f2c8e90 100644 --- a/spring-graphql/src/test/java/org/springframework/graphql/data/querydsl/QuerydslDataFetcherTests.java +++ b/spring-graphql/src/test/java/org/springframework/graphql/data/querydsl/QuerydslDataFetcherTests.java @@ -282,7 +282,7 @@ class QuerydslDataFetcherTests { if (configurer != null) { TypeRuntimeWiring.Builder typeBuilder = TypeRuntimeWiring.newTypeWiring("Query"); configurer.accept(typeBuilder); - graphQlSourceBuilder.configureRuntimeWiring(wiring -> wiring.type(typeBuilder)); + graphQlSourceBuilder.runtimeWiringConfigurer(wiring -> wiring.type(typeBuilder)); } GraphQLTypeVisitor visitor = QuerydslDataFetcher.registrationTypeVisitor( diff --git a/spring-graphql/src/test/java/org/springframework/graphql/web/BookTestUtils.java b/spring-graphql/src/test/java/org/springframework/graphql/web/BookTestUtils.java index f803f91f..9ff0b4b7 100644 --- a/spring-graphql/src/test/java/org/springframework/graphql/web/BookTestUtils.java +++ b/spring-graphql/src/test/java/org/springframework/graphql/web/BookTestUtils.java @@ -69,7 +69,7 @@ public abstract class BookTestUtils { private static GraphQlSource graphQlSource() { return GraphQlSource.builder() .schemaResources(new ClassPathResource("books/schema.graphqls")) - .configureRuntimeWiring(builder -> builder.type(TypeRuntimeWiring.newTypeWiring("Query") + .runtimeWiringConfigurer(builder -> builder.type(TypeRuntimeWiring.newTypeWiring("Query") .dataFetcher("bookById", (env) -> { Long id = Long.parseLong(env.getArgument("id")); return BookSource.getBook(id);