Skip to content
This repository was archived by the owner on Dec 19, 2023. It is now read-only.

Commit acf2a87

Browse files
committed
Build GraphQL on the fly after all
1 parent 5316fba commit acf2a87

File tree

5 files changed

+75
-24
lines changed

5 files changed

+75
-24
lines changed

graphql-kickstart-spring-boot-autoconfigure-webflux/build.gradle

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
dependencies {
22
compile(project(':graphql-kickstart-spring-webflux'))
3+
compileOnly(project(":graphql-kickstart-spring-boot-starter-tools"))
34

45
compile "org.springframework.boot:spring-boot-autoconfigure:$LIB_SPRING_BOOT_VER"
56
compile "com.graphql-java-kickstart:graphql-java-kickstart:$LIB_GRAPHQL_SERVLET_VER"

graphql-kickstart-spring-boot-autoconfigure-webflux/src/main/java/graphql/kickstart/spring/webflux/boot/GraphQLSpringWebfluxAutoConfiguration.java

Lines changed: 35 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,13 @@
22

33
import static graphql.kickstart.execution.GraphQLObjectMapper.newBuilder;
44

5-
import graphql.GraphQL;
5+
import graphql.execution.instrumentation.dataloader.DataLoaderDispatcherInstrumentationOptions;
6+
import graphql.kickstart.execution.BatchedDataLoaderGraphQLBuilder;
67
import graphql.kickstart.execution.GraphQLInvoker;
78
import graphql.kickstart.execution.GraphQLObjectMapper;
9+
import graphql.kickstart.execution.config.DefaultGraphQLSchemaProvider;
810
import graphql.kickstart.execution.config.GraphQLBuilder;
11+
import graphql.kickstart.execution.config.GraphQLSchemaProvider;
912
import graphql.kickstart.execution.config.ObjectMapperProvider;
1013
import graphql.kickstart.execution.subscriptions.GraphQLSubscriptionInvocationInputFactory;
1114
import graphql.kickstart.execution.subscriptions.apollo.ApolloSubscriptionConnectionListener;
@@ -21,16 +24,19 @@
2124
import graphql.kickstart.spring.webflux.ReactiveSubscriptionsProtocolFactory;
2225
import graphql.kickstart.spring.webflux.ReactiveWebSocketSubscriptionsHandler;
2326
import graphql.kickstart.spring.webflux.apollo.ReactiveApolloSubscriptionProtocolFactory;
27+
import graphql.kickstart.tools.boot.GraphQLJavaToolsAutoConfiguration;
2428
import graphql.schema.GraphQLSchema;
2529
import java.util.Collection;
2630
import java.util.HashMap;
2731
import java.util.HashSet;
2832
import java.util.Map;
2933
import java.util.Set;
34+
import java.util.function.Supplier;
3035
import lombok.extern.slf4j.Slf4j;
3136
import org.springframework.beans.factory.ObjectProvider;
3237
import org.springframework.beans.factory.annotation.Autowired;
3338
import org.springframework.beans.factory.annotation.Value;
39+
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
3440
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
3541
import org.springframework.context.annotation.Bean;
3642
import org.springframework.context.annotation.ComponentScan;
@@ -42,6 +48,7 @@
4248

4349
@Slf4j
4450
@Configuration
51+
@AutoConfigureAfter({GraphQLJavaToolsAutoConfiguration.class})
4552
@ComponentScan(basePackageClasses = GraphQLController.class)
4653
public class GraphQLSpringWebfluxAutoConfiguration {
4754

@@ -58,7 +65,8 @@ public GraphQLErrorStartupListener graphQLErrorStartupListener(ErrorHandlerSuppl
5865

5966
@Bean
6067
@ConditionalOnMissingBean
61-
public GraphQLObjectMapper graphQLObjectMapper(ObjectProvider<ObjectMapperProvider> provider, ErrorHandlerSupplier errorHandlerSupplier) {
68+
public GraphQLObjectMapper graphQLObjectMapper(ObjectProvider<ObjectMapperProvider> provider,
69+
ErrorHandlerSupplier errorHandlerSupplier) {
6270
GraphQLObjectMapper.Builder builder = newBuilder();
6371
builder.withGraphQLErrorHandler(errorHandlerSupplier);
6472
provider.ifAvailable(builder::withObjectMapperProvider);
@@ -77,20 +85,41 @@ public GraphQLSpringWebfluxRootObjectBuilder graphQLSpringWebfluxRootObjectBuild
7785
return new DefaultGraphQLSpringWebfluxRootObjectBuilder();
7886
}
7987

88+
@Bean
89+
@ConditionalOnMissingBean
90+
public GraphQLSchemaProvider graphQLSchemaProvider(GraphQLSchema schema) {
91+
return new DefaultGraphQLSchemaProvider(schema);
92+
}
93+
8094
@Bean
8195
@ConditionalOnMissingBean
8296
public GraphQLSpringWebfluxInvocationInputFactory graphQLSpringInvocationInputFactory(
97+
GraphQLSchemaProvider graphQLSchemaProvider,
8398
@Autowired(required = false) GraphQLSpringWebfluxContextBuilder contextBuilder,
8499
@Autowired(required = false) GraphQLSpringWebfluxRootObjectBuilder rootObjectBuilder
85100
) {
86-
return new GraphQLSpringWebfluxInvocationInputFactory(contextBuilder, rootObjectBuilder);
101+
return new GraphQLSpringWebfluxInvocationInputFactory(graphQLSchemaProvider, contextBuilder, rootObjectBuilder);
102+
}
103+
104+
@Bean
105+
@ConditionalOnMissingBean
106+
public GraphQLBuilder graphQLBuilder() {
107+
return new GraphQLBuilder();
108+
}
109+
110+
@Bean
111+
@ConditionalOnMissingBean
112+
public BatchedDataLoaderGraphQLBuilder batchedDataLoaderGraphQLBuilder(
113+
@Autowired(required = false) Supplier<DataLoaderDispatcherInstrumentationOptions> optionsSupplier
114+
) {
115+
return new BatchedDataLoaderGraphQLBuilder(optionsSupplier);
87116
}
88117

89118
@Bean
90119
@ConditionalOnMissingBean
91-
public GraphQLInvoker graphQLInvoker(GraphQLSchema schema) {
92-
GraphQL graphQL = new GraphQLBuilder().build(schema);
93-
return new GraphQLInvoker(graphQL);
120+
public GraphQLInvoker graphQLInvoker(GraphQLBuilder graphQLBuilder,
121+
BatchedDataLoaderGraphQLBuilder batchedDataLoaderGraphQLBuilder) {
122+
return new GraphQLInvoker(graphQLBuilder, batchedDataLoaderGraphQLBuilder);
94123
}
95124

96125
@Bean

graphql-kickstart-spring-support/src/main/java/graphql/kickstart/spring/DefaultGraphQLSpringInvocationInputFactory.java

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,30 @@
11
package graphql.kickstart.spring;
22

33
import graphql.kickstart.execution.GraphQLRequest;
4+
import graphql.kickstart.execution.config.GraphQLSchemaProvider;
45
import graphql.kickstart.execution.input.GraphQLBatchedInvocationInput;
56
import graphql.kickstart.execution.input.GraphQLSingleInvocationInput;
67
import java.util.Collection;
8+
import java.util.Objects;
79
import java.util.function.Supplier;
10+
import lombok.AccessLevel;
11+
import lombok.Getter;
812
import org.springframework.web.server.ServerWebExchange;
913

14+
@Getter(AccessLevel.PROTECTED)
1015
public class DefaultGraphQLSpringInvocationInputFactory implements GraphQLSpringInvocationInputFactory {
1116

17+
private final Supplier<GraphQLSchemaProvider> schemaProviderSupplier;
1218
private Supplier<GraphQLSpringContextBuilder> contextBuilderSupplier = () -> (GraphQLSpringServerWebExchangeContext::new);
1319
private Supplier<GraphQLSpringRootObjectBuilder> rootObjectBuilderSupplier = () -> (serverWebExchange -> new Object());
1420

1521
public DefaultGraphQLSpringInvocationInputFactory(
22+
GraphQLSchemaProvider schemaProvider,
1623
GraphQLSpringContextBuilder contextBuilder,
1724
GraphQLSpringRootObjectBuilder rootObjectBuilder
1825
) {
26+
Objects.requireNonNull(schemaProvider, "GraphQLSchemaProvider is required");
27+
this.schemaProviderSupplier = () -> schemaProvider;
1928
if (contextBuilder != null) {
2029
contextBuilderSupplier = () -> contextBuilder;
2130
}
@@ -25,9 +34,11 @@ public DefaultGraphQLSpringInvocationInputFactory(
2534
}
2635

2736
public DefaultGraphQLSpringInvocationInputFactory(
37+
Supplier<GraphQLSchemaProvider> schemaProviderSupplier,
2838
Supplier<GraphQLSpringContextBuilder> contextBuilderSupplier,
2939
Supplier<GraphQLSpringRootObjectBuilder> rootObjectBuilderSupplier
3040
) {
41+
this.schemaProviderSupplier = Objects.requireNonNull(schemaProviderSupplier, "GraphQLSchemaProvider is required");
3142
if (contextBuilderSupplier != null) {
3243
this.contextBuilderSupplier = contextBuilderSupplier;
3344
}
@@ -40,7 +51,7 @@ public DefaultGraphQLSpringInvocationInputFactory(
4051
public GraphQLSingleInvocationInput create(GraphQLRequest graphQLRequest, ServerWebExchange serverWebExchange) {
4152
return new GraphQLSingleInvocationInput(
4253
graphQLRequest,
43-
null,
54+
schemaProviderSupplier.get().getSchema(),
4455
contextBuilderSupplier.get().build(serverWebExchange),
4556
rootObjectBuilderSupplier.get().build(serverWebExchange)
4657
);
@@ -52,12 +63,4 @@ public GraphQLBatchedInvocationInput create(Collection<GraphQLRequest> graphQLRe
5263
throw new UnsupportedOperationException("Batch queries not suppoprted yet");
5364
}
5465

55-
protected Supplier<GraphQLSpringContextBuilder> getContextBuilderSupplier() {
56-
return contextBuilderSupplier;
57-
}
58-
59-
protected Supplier<GraphQLSpringRootObjectBuilder> getRootObjectBuilderSupplier() {
60-
return rootObjectBuilderSupplier;
61-
}
62-
6366
}

graphql-kickstart-spring-webflux/src/main/java/graphql/kickstart/spring/webflux/GraphQLSpringWebfluxInvocationInputFactory.java

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package graphql.kickstart.spring.webflux;
22

33
import graphql.kickstart.execution.GraphQLRequest;
4+
import graphql.kickstart.execution.config.GraphQLSchemaProvider;
45
import graphql.kickstart.execution.input.GraphQLSingleInvocationInput;
56
import graphql.kickstart.execution.subscriptions.GraphQLSubscriptionInvocationInputFactory;
67
import graphql.kickstart.execution.subscriptions.SubscriptionSession;
@@ -14,22 +15,24 @@ public class GraphQLSpringWebfluxInvocationInputFactory
1415
extends DefaultGraphQLSpringInvocationInputFactory
1516
implements GraphQLSubscriptionInvocationInputFactory {
1617

17-
public GraphQLSpringWebfluxInvocationInputFactory(GraphQLSpringContextBuilder contextBuilder,
18+
public GraphQLSpringWebfluxInvocationInputFactory(GraphQLSchemaProvider schemaProvider,
19+
GraphQLSpringContextBuilder contextBuilder,
1820
GraphQLSpringRootObjectBuilder rootObjectBuilder) {
19-
super(contextBuilder, rootObjectBuilder);
21+
super(schemaProvider, contextBuilder, rootObjectBuilder);
2022
}
2123

2224
public GraphQLSpringWebfluxInvocationInputFactory(
25+
Supplier<GraphQLSchemaProvider> schemaProviderSupplier,
2326
Supplier<GraphQLSpringContextBuilder> contextBuilderSupplier,
2427
Supplier<GraphQLSpringRootObjectBuilder> rootObjectBuilderSupplier) {
25-
super(contextBuilderSupplier, rootObjectBuilderSupplier);
28+
super(schemaProviderSupplier, contextBuilderSupplier, rootObjectBuilderSupplier);
2629
}
2730

2831
@Override
2932
public GraphQLSingleInvocationInput create(GraphQLRequest graphQLRequest, SubscriptionSession session) {
3033
return new GraphQLSingleInvocationInput(
3134
graphQLRequest,
32-
null,
35+
getSchemaProviderSupplier().get().getSchema(),
3336
((GraphQLSpringWebfluxContextBuilder) getContextBuilderSupplier().get()).build((WebSocketSession) session.unwrap()),
3437
((GraphQLSpringWebfluxRootObjectBuilder) getRootObjectBuilderSupplier().get()).build((WebSocketSession) session.unwrap())
3538
);

graphql-spring-boot-autoconfigure/src/main/java/com/oembedler/moon/graphql/boot/GraphQLWebsocketAutoConfiguration.java

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,21 @@
11
package com.oembedler.moon.graphql.boot;
22

3-
import graphql.GraphQL;
3+
import graphql.execution.instrumentation.dataloader.DataLoaderDispatcherInstrumentationOptions;
4+
import graphql.kickstart.execution.BatchedDataLoaderGraphQLBuilder;
45
import graphql.kickstart.execution.GraphQLInvoker;
56
import graphql.kickstart.execution.GraphQLObjectMapper;
67
import graphql.kickstart.execution.config.GraphQLBuilder;
78
import graphql.kickstart.execution.subscriptions.GraphQLSubscriptionInvocationInputFactory;
89
import graphql.kickstart.execution.subscriptions.SubscriptionConnectionListener;
910
import graphql.kickstart.execution.subscriptions.apollo.KeepAliveSubscriptionConnectionListener;
1011
import graphql.kickstart.tools.boot.GraphQLJavaToolsAutoConfiguration;
11-
import graphql.schema.GraphQLSchema;
1212
import graphql.servlet.GraphQLWebsocketServlet;
1313
import java.time.Duration;
1414
import java.util.Collection;
1515
import java.util.HashSet;
1616
import java.util.Optional;
1717
import java.util.Set;
18+
import java.util.function.Supplier;
1819
import javax.websocket.server.ServerContainer;
1920
import org.springframework.beans.factory.annotation.Autowired;
2021
import org.springframework.beans.factory.annotation.Value;
@@ -48,9 +49,23 @@ public class GraphQLWebsocketAutoConfiguration {
4849

4950
@Bean
5051
@ConditionalOnMissingBean
51-
public GraphQLInvoker graphQLInvoker(GraphQLSchema schema) {
52-
GraphQL graphQL = new GraphQLBuilder().build(schema);
53-
return new GraphQLInvoker(graphQL);
52+
public GraphQLBuilder graphQLBuilder() {
53+
return new GraphQLBuilder();
54+
}
55+
56+
@Bean
57+
@ConditionalOnMissingBean
58+
public BatchedDataLoaderGraphQLBuilder batchedDataLoaderGraphQLBuilder(
59+
@Autowired(required = false) Supplier<DataLoaderDispatcherInstrumentationOptions> optionsSupplier
60+
) {
61+
return new BatchedDataLoaderGraphQLBuilder(optionsSupplier);
62+
}
63+
64+
@Bean
65+
@ConditionalOnMissingBean
66+
public GraphQLInvoker graphQLInvoker(GraphQLBuilder graphQLBuilder,
67+
BatchedDataLoaderGraphQLBuilder batchedDataLoaderGraphQLBuilder) {
68+
return new GraphQLInvoker(graphQLBuilder, batchedDataLoaderGraphQLBuilder);
5469
}
5570

5671
@Bean

0 commit comments

Comments
 (0)