Skip to content

Commit 994a0b6

Browse files
authored
feat: add schema wiring support for Spring Graphql 1.0 project (#310)
* feat: add initial support for Spring Graphql 1.0 project * feat: extract JavaScalars into graphql-jpa-query-scalars module * fix: move JavaScalarsWiringPostProcessor to graphql-jpa-query-scalars * fix: add GraphQLJpaQueryStarterIT graphql test support * fix: polish graphql source auto configuration
1 parent b9f653f commit 994a0b6

File tree

65 files changed

+2210
-165
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

65 files changed

+2210
-165
lines changed

graphql-jpa-query-autoconfigure/pom.xml

+9-1
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,15 @@
99
<artifactId>graphql-jpa-query-autoconfigure</artifactId>
1010

1111
<dependencies>
12+
<dependency>
13+
<groupId>com.introproventures</groupId>
14+
<artifactId>graphql-jpa-query-scalars</artifactId>
15+
</dependency>
16+
<dependency>
17+
<groupId>com.introproventures</groupId>
18+
<artifactId>graphql-jpa-query-schema</artifactId>
19+
<optional>true</optional>
20+
</dependency>
1221
<dependency>
1322
<groupId>com.graphql-java</groupId>
1423
<artifactId>graphql-java</artifactId>
@@ -25,7 +34,6 @@
2534
<dependency>
2635
<groupId>org.hibernate.validator</groupId>
2736
<artifactId>hibernate-validator</artifactId>
28-
<scope>test</scope>
2937
</dependency>
3038
<dependency>
3139
<groupId>org.springframework.boot</groupId>

graphql-jpa-query-autoconfigure/src/main/java/com/introproventures/graphql/jpa/query/autoconfigure/GraphQLJpaQueryProperties.java

+7-3
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,11 @@
1515
*/
1616
package com.introproventures.graphql.jpa.query.autoconfigure;
1717

18-
import javax.validation.constraints.NotEmpty;
19-
2018
import org.springframework.boot.context.properties.ConfigurationProperties;
2119
import org.springframework.validation.annotation.Validated;
2220

21+
import javax.validation.constraints.NotEmpty;
22+
2323
@ConfigurationProperties(prefix="spring.graphql.jpa.query")
2424
@Validated
2525
public class GraphQLJpaQueryProperties {
@@ -61,7 +61,11 @@ public class GraphQLJpaQueryProperties {
6161
*/
6262
private boolean enabled;
6363

64-
@NotEmpty
64+
/**
65+
* Web path for web controller
66+
* Use 'spring.graphql.jpa.query.web.path' to customize default /graphql path
67+
*/
68+
@Deprecated
6569
private String path;
6670

6771
/**

graphql-jpa-query-autoconfigure/src/main/java/com/introproventures/graphql/jpa/query/autoconfigure/GraphQLSchemaAutoConfiguration.java

+5-9
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
11
package com.introproventures.graphql.jpa.query.autoconfigure;
22

3-
import java.util.ArrayList;
4-
import java.util.List;
5-
3+
import graphql.GraphQL;
4+
import graphql.schema.GraphQLSchema;
65
import org.springframework.beans.factory.annotation.Autowired;
76
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
87
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
@@ -13,8 +12,8 @@
1312
import org.springframework.context.annotation.PropertySources;
1413
import org.springframework.util.CollectionUtils;
1514

16-
import graphql.GraphQL;
17-
import graphql.schema.GraphQLSchema;
15+
import java.util.ArrayList;
16+
import java.util.List;
1817

1918
@Configuration
2019
@ConditionalOnClass(GraphQL.class)
@@ -27,9 +26,6 @@ public class GraphQLSchemaAutoConfiguration {
2726

2827
private final List<GraphQLSchemaConfigurer> graphQLSchemaConfigurers = new ArrayList<>();
2928

30-
@Autowired
31-
private GraphQLJpaQueryProperties properties;
32-
3329
@Autowired(required = true)
3430
public void setGraphQLSchemaConfigurers(List<GraphQLSchemaConfigurer> configurers) {
3531
if (!CollectionUtils.isEmpty(configurers)) {
@@ -39,7 +35,7 @@ public void setGraphQLSchemaConfigurers(List<GraphQLSchemaConfigurer> configurer
3935

4036
@Bean
4137
@ConditionalOnMissingBean(GraphQLSchema.class)
42-
public GraphQLSchemaFactoryBean graphQLSchemaFactoryBean() {
38+
public GraphQLSchemaFactoryBean graphQLSchemaFactoryBean(GraphQLJpaQueryProperties properties) {
4339
GraphQLShemaRegistrationImpl graphQLShemaRegistration = new GraphQLShemaRegistrationImpl();
4440

4541
for (GraphQLSchemaConfigurer configurer : graphQLSchemaConfigurers) {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
package com.introproventures.graphql.jpa.query.autoconfigure;
2+
3+
import com.introproventures.graphql.jpa.query.schema.GraphQLSchemaBuilder;
4+
import com.introproventures.graphql.jpa.query.schema.RestrictedKeysProvider;
5+
import com.introproventures.graphql.jpa.query.schema.impl.GraphQLJpaSchemaBuilder;
6+
import graphql.GraphQL;
7+
import org.springframework.beans.factory.ObjectProvider;
8+
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
9+
import org.springframework.boot.autoconfigure.AutoConfigureBefore;
10+
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
11+
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
12+
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
13+
import org.springframework.boot.autoconfigure.condition.ConditionalOnSingleCandidate;
14+
import org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration;
15+
import org.springframework.context.annotation.Bean;
16+
import org.springframework.context.annotation.Configuration;
17+
18+
import javax.persistence.EntityManagerFactory;
19+
20+
@Configuration
21+
@ConditionalOnClass({GraphQL.class, GraphQLSchemaBuilder.class})
22+
@ConditionalOnProperty(name="spring.graphql.jpa.query.enabled", havingValue="true", matchIfMissing=true)
23+
@AutoConfigureBefore(GraphQLSchemaAutoConfiguration.class)
24+
@AutoConfigureAfter(HibernateJpaAutoConfiguration.class)
25+
public class GraphQLSchemaBuilderAutoConfiguration {
26+
@Bean
27+
@ConditionalOnMissingBean
28+
@ConditionalOnSingleCandidate(EntityManagerFactory.class)
29+
public GraphQLSchemaBuilder graphQLJpaSchemaBuilder(final EntityManagerFactory entityManagerFactory,
30+
ObjectProvider<RestrictedKeysProvider> restrictedKeysProvider) {
31+
GraphQLJpaSchemaBuilder bean = new GraphQLJpaSchemaBuilder(entityManagerFactory.createEntityManager());
32+
33+
restrictedKeysProvider.ifAvailable(bean::restrictedKeysProvider);
34+
35+
return bean;
36+
}
37+
38+
@Bean
39+
@ConditionalOnMissingBean
40+
public GraphQLSchemaConfigurer graphQLJpaQuerySchemaConfigurer(GraphQLSchemaBuilder graphQLSchemaBuilder) {
41+
42+
return (registry) -> {
43+
registry.register(graphQLSchemaBuilder.build());
44+
};
45+
}
46+
}

graphql-jpa-query-autoconfigure/src/main/java/com/introproventures/graphql/jpa/query/autoconfigure/GraphQLSchemaConfigurer.java

+1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.introproventures.graphql.jpa.query.autoconfigure;
22

3+
@FunctionalInterface
34
public interface GraphQLSchemaConfigurer {
45

56
void configure(GraphQLShemaRegistration registry);

graphql-jpa-query-autoconfigure/src/main/java/com/introproventures/graphql/jpa/query/autoconfigure/GraphQLSchemaFactoryBean.java

+21-23
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,5 @@
11
package com.introproventures.graphql.jpa.query.autoconfigure;
22

3-
import static graphql.Assert.assertTrue;
4-
import static graphql.schema.FieldCoordinates.coordinates;
5-
import static graphql.util.TraversalControl.CONTINUE;
6-
7-
import java.util.Arrays;
8-
import java.util.Collection;
9-
import java.util.List;
10-
import java.util.Map;
11-
import java.util.Objects;
12-
import java.util.Optional;
13-
import java.util.Set;
14-
import java.util.concurrent.ConcurrentHashMap;
15-
import java.util.function.Function;
16-
import java.util.function.Predicate;
17-
import java.util.stream.Collectors;
18-
import java.util.stream.Stream;
19-
20-
import graphql.schema.GraphQLNamedType;
21-
import graphql.schema.GraphQLSchemaElement;
22-
import org.springframework.beans.factory.config.AbstractFactoryBean;
23-
243
import graphql.Internal;
254
import graphql.schema.DataFetcher;
265
import graphql.schema.FieldCoordinates;
@@ -29,16 +8,35 @@
298
import graphql.schema.GraphQLFieldDefinition;
309
import graphql.schema.GraphQLFieldsContainer;
3110
import graphql.schema.GraphQLInterfaceType;
11+
import graphql.schema.GraphQLNamedType;
3212
import graphql.schema.GraphQLObjectType;
3313
import graphql.schema.GraphQLSchema;
14+
import graphql.schema.GraphQLSchemaElement;
3415
import graphql.schema.GraphQLType;
3516
import graphql.schema.GraphQLTypeVisitorStub;
3617
import graphql.schema.GraphQLUnionType;
3718
import graphql.schema.PropertyDataFetcher;
3819
import graphql.schema.TypeResolver;
3920
import graphql.util.TraversalControl;
4021
import graphql.util.TraverserContext;
41-
import graphql.util.Traverser;
22+
import org.springframework.beans.factory.config.AbstractFactoryBean;
23+
24+
import java.util.Arrays;
25+
import java.util.Collection;
26+
import java.util.List;
27+
import java.util.Map;
28+
import java.util.Objects;
29+
import java.util.Optional;
30+
import java.util.Set;
31+
import java.util.concurrent.ConcurrentHashMap;
32+
import java.util.function.Function;
33+
import java.util.function.Predicate;
34+
import java.util.stream.Collectors;
35+
import java.util.stream.Stream;
36+
37+
import static graphql.Assert.assertTrue;
38+
import static graphql.schema.FieldCoordinates.coordinates;
39+
import static graphql.util.TraversalControl.CONTINUE;
4240

4341

4442
public class GraphQLSchemaFactoryBean extends AbstractFactoryBean<GraphQLSchema>{
@@ -145,7 +143,7 @@ protected GraphQLSchema createInstance() throws Exception {
145143
if (!types.isEmpty()) {
146144
schemaBuilder.additionalTypes(types);
147145
}
148-
146+
149147
if(!mutations.isEmpty())
150148
schemaBuilder.mutation(GraphQLObjectType.newObject()
151149
.name(this.mutationName)
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
11
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
2-
com.introproventures.graphql.jpa.query.autoconfigure.GraphQLSchemaAutoConfiguration
2+
com.introproventures.graphql.jpa.query.autoconfigure.GraphQLSchemaAutoConfiguration,\
3+
com.introproventures.graphql.jpa.query.autoconfigure.GraphQLSchemaBuilderAutoConfiguration

graphql-jpa-query-autoconfigure/src/main/resources/com/introproventures/graphql/jpa/query/boot/autoconfigure/default.properties

-1
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,3 @@ spring.graphql.jpa.query.description=Query root
33
spring.graphql.jpa.query.useDistinctParameter=false
44
spring.graphql.jpa.query.defaultDistinct=true
55
spring.graphql.jpa.query.enabled=true
6-
spring.graphql.jpa.query.path=/graphql

graphql-jpa-query-autoconfigure/src/test/java/com/introproventures/graphql/jpa/query/autoconfigure/GraphQLSchemaAutoConfigurationTest.java

+32-25
Original file line numberDiff line numberDiff line change
@@ -1,47 +1,45 @@
11
package com.introproventures.graphql.jpa.query.autoconfigure;
22

3-
import static graphql.annotations.AnnotationsSchemaCreator.newAnnotationsSchema;
4-
import static graphql.schema.GraphQLFieldDefinition.newFieldDefinition;
5-
import static org.assertj.core.api.Assertions.assertThat;
6-
7-
import java.util.Collections;
8-
import java.util.Map;
9-
import java.util.Set;
10-
import java.util.stream.Collectors;
11-
12-
import org.junit.Test;
13-
import org.junit.runner.RunWith;
14-
import org.reflections.Reflections;
15-
import org.springframework.beans.factory.annotation.Autowired;
16-
import org.springframework.beans.factory.annotation.Value;
17-
import org.springframework.boot.autoconfigure.SpringBootApplication;
18-
import org.springframework.boot.test.context.SpringBootTest;
19-
import org.springframework.boot.test.context.SpringBootTest.WebEnvironment;
20-
import org.springframework.context.annotation.Configuration;
21-
import org.springframework.stereotype.Component;
22-
import org.springframework.test.context.junit4.SpringRunner;
23-
import org.springframework.util.StringUtils;
24-
253
import com.introproventures.graphql.jpa.query.autoconfigure.support.AdditionalGraphQLType;
264
import com.introproventures.graphql.jpa.query.autoconfigure.support.MutationRoot;
275
import com.introproventures.graphql.jpa.query.autoconfigure.support.QueryRoot;
286
import com.introproventures.graphql.jpa.query.autoconfigure.support.SubscriptionRoot;
29-
30-
import graphql.Directives;
317
import graphql.GraphQL;
328
import graphql.Scalars;
339
import graphql.annotations.AnnotationsSchemaCreator;
3410
import graphql.annotations.annotationTypes.GraphQLField;
3511
import graphql.annotations.annotationTypes.GraphQLInvokeDetached;
3612
import graphql.annotations.annotationTypes.GraphQLName;
3713
import graphql.annotations.annotationTypes.directives.definition.GraphQLDirectiveDefinition;
14+
import graphql.scalars.ExtendedScalars;
3815
import graphql.schema.FieldCoordinates;
3916
import graphql.schema.GraphQLCodeRegistry;
4017
import graphql.schema.GraphQLDirective;
4118
import graphql.schema.GraphQLFieldDefinition;
4219
import graphql.schema.GraphQLObjectType;
4320
import graphql.schema.GraphQLSchema;
4421
import graphql.schema.StaticDataFetcher;
22+
import org.junit.Test;
23+
import org.junit.runner.RunWith;
24+
import org.reflections.Reflections;
25+
import org.springframework.beans.factory.annotation.Autowired;
26+
import org.springframework.beans.factory.annotation.Value;
27+
import org.springframework.boot.autoconfigure.SpringBootApplication;
28+
import org.springframework.boot.test.context.SpringBootTest;
29+
import org.springframework.boot.test.context.SpringBootTest.WebEnvironment;
30+
import org.springframework.context.annotation.Configuration;
31+
import org.springframework.stereotype.Component;
32+
import org.springframework.test.context.junit4.SpringRunner;
33+
import org.springframework.util.StringUtils;
34+
35+
import java.util.Collections;
36+
import java.util.Map;
37+
import java.util.Set;
38+
import java.util.stream.Collectors;
39+
40+
import static graphql.annotations.AnnotationsSchemaCreator.newAnnotationsSchema;
41+
import static graphql.schema.GraphQLFieldDefinition.newFieldDefinition;
42+
import static org.assertj.core.api.Assertions.assertThat;
4543

4644
@RunWith(SpringRunner.class)
4745
@SpringBootTest(webEnvironment=WebEnvironment.NONE)
@@ -124,7 +122,13 @@ public static class AnnotatedQuery implements QueryRoot {
124122
public Greeting greeting(@GraphQLName("name") String name) {
125123
return new Greeting("Hi, " + name + "!");
126124
}
127-
125+
126+
@GraphQLField
127+
@GraphQLInvokeDetached
128+
public Long count() {
129+
return Long.valueOf(1);
130+
}
131+
128132
public static class Greeting {
129133

130134
@GraphQLField
@@ -151,6 +155,9 @@ public void configure(GraphQLShemaRegistration registry) {
151155
.field(GraphQLFieldDefinition.newFieldDefinition()
152156
.name("greet2")
153157
.type(Scalars.GraphQLString))
158+
.field(GraphQLFieldDefinition.newFieldDefinition()
159+
.name("count1")
160+
.type(ExtendedScalars.GraphQLLong))
154161
.build();
155162

156163
GraphQLCodeRegistry codeRegistry = GraphQLCodeRegistry.newCodeRegistry()

graphql-jpa-query-autoconfigure/src/test/resources/application.yml

-1
Original file line numberDiff line numberDiff line change
@@ -11,4 +11,3 @@ spring:
1111
name: GraphQLBooks
1212
description: GraphQL Books Schema Description
1313
enabled: true
14-
path: /graphql

0 commit comments

Comments
 (0)