Skip to content

Commit 9809aef

Browse files
authored
fix: add spring-graphql to graphq-jpa-query autoconfigure module (#315)
* fix: move spring graphql auto configuration to common autoconfigure * fix: add EnableGraphQLJpaQuerySchema annotation auto configuration * fix: add GraphQLJPASchemaBuilderCustomizer configuration * fix: cleanup `@EntityScan` annotation * fix: clean up * fix: configure builder from default properties * fix: add default name and description config properties * fix: upgrade reflections to 0.10.2 * fix: add EnableGraphQLJpaQuerySchema to test coverage * fix: add TestEntity for better code coverage * fix: use AutoConfiguration annotation for GraphQLSchemaBuilderAutoConfiguration * fix: use composite auto configuration annotation
1 parent e7dbbce commit 9809aef

File tree

30 files changed

+429
-270
lines changed

30 files changed

+429
-270
lines changed
Lines changed: 71 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -1,62 +1,72 @@
1-
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
2-
<modelVersion>4.0.0</modelVersion>
3-
<parent>
4-
<groupId>com.introproventures</groupId>
5-
<artifactId>graphql-jpa-query-build</artifactId>
6-
<version>0.5.4-SNAPSHOT</version>
7-
<relativePath>../graphql-jpa-query-build</relativePath>
8-
</parent>
9-
<artifactId>graphql-jpa-query-autoconfigure</artifactId>
10-
11-
<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>
21-
<dependency>
22-
<groupId>com.graphql-java</groupId>
23-
<artifactId>graphql-java</artifactId>
24-
<optional>true</optional>
25-
</dependency>
26-
<dependency>
27-
<groupId>org.springframework.boot</groupId>
28-
<artifactId>spring-boot-autoconfigure</artifactId>
29-
</dependency>
30-
<dependency>
31-
<groupId>javax.validation</groupId>
32-
<artifactId>validation-api</artifactId>
33-
</dependency>
34-
<dependency>
35-
<groupId>org.hibernate.validator</groupId>
36-
<artifactId>hibernate-validator</artifactId>
37-
</dependency>
38-
<dependency>
39-
<groupId>org.springframework.boot</groupId>
40-
<artifactId>spring-boot-configuration-processor</artifactId>
41-
<optional>true</optional>
42-
</dependency>
43-
<dependency>
44-
<groupId>io.github.graphql-java</groupId>
45-
<artifactId>graphql-java-annotations</artifactId>
46-
<version>9.1</version>
47-
<scope>test</scope>
48-
</dependency>
49-
<dependency>
50-
<groupId>org.reflections</groupId>
51-
<artifactId>reflections</artifactId>
52-
<version>0.9.11</version>
53-
<scope>test</scope>
54-
</dependency>
55-
<dependency>
56-
<groupId>io.projectreactor</groupId>
57-
<artifactId>reactor-test</artifactId>
58-
<scope>test</scope>
59-
</dependency>
60-
</dependencies>
61-
1+
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
2+
<modelVersion>4.0.0</modelVersion>
3+
<parent>
4+
<groupId>com.introproventures</groupId>
5+
<artifactId>graphql-jpa-query-build</artifactId>
6+
<version>0.5.4-SNAPSHOT</version>
7+
<relativePath>../graphql-jpa-query-build</relativePath>
8+
</parent>
9+
<artifactId>graphql-jpa-query-autoconfigure</artifactId>
10+
11+
<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>
21+
<dependency>
22+
<groupId>com.graphql-java</groupId>
23+
<artifactId>graphql-java</artifactId>
24+
<optional>true</optional>
25+
</dependency>
26+
<dependency>
27+
<groupId>org.springframework.boot</groupId>
28+
<artifactId>spring-boot-starter-graphql</artifactId>
29+
<optional>true</optional>
30+
</dependency>
31+
<dependency>
32+
<groupId>org.springframework.boot</groupId>
33+
<artifactId>spring-boot-autoconfigure</artifactId>
34+
</dependency>
35+
<dependency>
36+
<groupId>javax.validation</groupId>
37+
<artifactId>validation-api</artifactId>
38+
</dependency>
39+
<dependency>
40+
<groupId>org.hibernate.validator</groupId>
41+
<artifactId>hibernate-validator</artifactId>
42+
</dependency>
43+
<dependency>
44+
<groupId>org.springframework.boot</groupId>
45+
<artifactId>spring-boot-configuration-processor</artifactId>
46+
<optional>true</optional>
47+
</dependency>
48+
<dependency>
49+
<groupId>io.github.graphql-java</groupId>
50+
<artifactId>graphql-java-annotations</artifactId>
51+
<version>9.1</version>
52+
<scope>test</scope>
53+
</dependency>
54+
<dependency>
55+
<groupId>org.reflections</groupId>
56+
<artifactId>reflections</artifactId>
57+
<version>0.10.2</version>
58+
<scope>test</scope>
59+
</dependency>
60+
<dependency>
61+
<groupId>io.projectreactor</groupId>
62+
<artifactId>reactor-test</artifactId>
63+
<scope>test</scope>
64+
</dependency>
65+
<dependency>
66+
<groupId>org.springframework.boot</groupId>
67+
<artifactId>spring-boot-starter-data-jpa</artifactId>
68+
<scope>test</scope>
69+
</dependency>
70+
</dependencies>
71+
6272
</project>
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package com.introproventures.graphql.jpa.query.autoconfigure;
2+
3+
import org.springframework.boot.autoconfigure.ImportAutoConfiguration;
4+
import org.springframework.boot.autoconfigure.domain.EntityScan;
5+
import org.springframework.context.annotation.Import;
6+
import org.springframework.core.annotation.AliasFor;
7+
8+
import java.lang.annotation.Documented;
9+
import java.lang.annotation.ElementType;
10+
import java.lang.annotation.Retention;
11+
import java.lang.annotation.RetentionPolicy;
12+
import java.lang.annotation.Target;
13+
14+
@Target({ ElementType.TYPE })
15+
@Retention(RetentionPolicy.RUNTIME)
16+
@Documented
17+
@EntityScan
18+
@Import(EnableGraphQLJpaQuerySchemaImportSelector.class)
19+
@ImportAutoConfiguration(GraphQLSchemaBuilderAutoConfiguration.class)
20+
public @interface EnableGraphQLJpaQuerySchema {
21+
@AliasFor(annotation = EntityScan.class, attribute = "basePackageClasses")
22+
Class<?>[] value() default {};
23+
24+
@AliasFor(annotation = EntityScan.class, attribute = "basePackageClasses")
25+
Class<?>[] basePackageClasses() default {};
26+
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package com.introproventures.graphql.jpa.query.autoconfigure;
2+
3+
import org.springframework.context.annotation.ImportSelector;
4+
import org.springframework.core.annotation.AnnotationAttributes;
5+
import org.springframework.core.type.AnnotationMetadata;
6+
7+
import java.util.ArrayList;
8+
import java.util.List;
9+
import java.util.stream.Stream;
10+
11+
class EnableGraphQLJpaQuerySchemaImportSelector implements ImportSelector {
12+
13+
private static List<String> packageNames = new ArrayList<>();
14+
15+
@Override
16+
public String[] selectImports(AnnotationMetadata importingClassMetadata) {
17+
AnnotationAttributes attributes = AnnotationAttributes.fromMap(
18+
importingClassMetadata.getAnnotationAttributes(
19+
EnableGraphQLJpaQuerySchema.class.getName(), false));
20+
21+
if (attributes != null) {
22+
Stream.of(attributes.getClassArray("basePackageClasses"))
23+
.map(Class::getPackage)
24+
.map(Package::getName)
25+
.forEach(packageNames::add);
26+
}
27+
28+
return new String[0];
29+
}
30+
31+
static List<String> getPackageNames() {
32+
return packageNames;
33+
}
34+
35+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package com.introproventures.graphql.jpa.query.autoconfigure;
2+
3+
import com.introproventures.graphql.jpa.query.schema.impl.GraphQLJpaSchemaBuilder;
4+
5+
@FunctionalInterface
6+
public interface GraphQLJPASchemaBuilderCustomizer {
7+
void customize(GraphQLJpaSchemaBuilder builder);
8+
}
Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,24 @@
1-
package com.introproventures.graphql.jpa.query.boot.autoconfigure;
1+
package com.introproventures.graphql.jpa.query.autoconfigure;
22

3+
import graphql.GraphQL;
34
import org.dataloader.DataLoaderOptions;
45
import org.dataloader.MappedBatchLoaderWithContext;
56
import org.springframework.beans.factory.InitializingBean;
67
import org.springframework.beans.factory.ListableBeanFactory;
7-
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
8+
import org.springframework.boot.autoconfigure.AutoConfiguration;
9+
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
810
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
911
import org.springframework.boot.autoconfigure.graphql.GraphQlAutoConfiguration;
1012
import org.springframework.context.annotation.Bean;
11-
import org.springframework.context.annotation.Configuration;
1213
import org.springframework.graphql.ExecutionGraphQlService;
1314
import org.springframework.graphql.execution.BatchLoaderRegistry;
1415
import org.springframework.graphql.execution.GraphQlSource;
1516
import reactor.core.publisher.Mono;
1617

1718
import static com.introproventures.graphql.jpa.query.schema.impl.BatchLoaderRegistry.newDataLoaderRegistry;
1819

19-
@Configuration
20-
@AutoConfigureAfter(GraphQlAutoConfiguration.class)
20+
@AutoConfiguration(after = GraphQlAutoConfiguration.class)
21+
@ConditionalOnClass({GraphQL.class, GraphQlSource.class})
2122
public class GraphQLJpaQueryGraphQlExecutionAutoConfiguration {
2223

2324
@Bean
Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -13,15 +13,16 @@
1313
* See the License for the specific language governing permissions and
1414
* limitations under the License.
1515
*/
16-
package com.introproventures.graphql.jpa.query.boot.autoconfigure;
16+
package com.introproventures.graphql.jpa.query.autoconfigure;
1717

18-
import com.introproventures.graphql.jpa.query.autoconfigure.GraphQLSchemaConfigurer;
18+
import java.util.function.Consumer;
19+
import java.util.stream.Collectors;
1920
import graphql.GraphQL;
2021
import graphql.execution.instrumentation.Instrumentation;
2122
import graphql.schema.GraphQLSchema;
2223
import org.springframework.beans.factory.ListableBeanFactory;
2324
import org.springframework.beans.factory.ObjectProvider;
24-
import org.springframework.boot.autoconfigure.AutoConfigureBefore;
25+
import org.springframework.boot.autoconfigure.AutoConfiguration;
2526
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
2627
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
2728
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
@@ -31,21 +32,16 @@
3132
import org.springframework.boot.autoconfigure.graphql.GraphQlSourceBuilderCustomizer;
3233
import org.springframework.boot.context.properties.EnableConfigurationProperties;
3334
import org.springframework.context.annotation.Bean;
34-
import org.springframework.context.annotation.Configuration;
3535
import org.springframework.core.io.support.ResourcePatternResolver;
3636
import org.springframework.graphql.execution.DataFetcherExceptionResolver;
3737
import org.springframework.graphql.execution.GraphQlSource;
3838
import org.springframework.graphql.execution.RuntimeWiringConfigurer;
3939
import org.springframework.graphql.execution.SubscriptionExceptionResolver;
4040

41-
import java.util.function.Consumer;
42-
import java.util.stream.Collectors;
43-
44-
@Configuration
41+
@AutoConfiguration(before = {GraphQlAutoConfiguration.class, GraphQLSchemaAutoConfiguration.class})
4542
@ConditionalOnClass({GraphQL.class, GraphQlSource.class, GraphQLSchemaConfigurer.class})
4643
@ConditionalOnProperty(name="spring.graphql.jpa.query.enabled", havingValue="true", matchIfMissing=true)
4744
@EnableConfigurationProperties(GraphQlProperties.class)
48-
@AutoConfigureBefore(GraphQlAutoConfiguration.class)
4945
public class GraphQLJpaQueryGraphQlSourceAutoConfiguration {
5046

5147
@Bean

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

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,10 @@
1515
*/
1616
package com.introproventures.graphql.jpa.query.autoconfigure;
1717

18+
import javax.validation.constraints.NotEmpty;
1819
import org.springframework.boot.context.properties.ConfigurationProperties;
1920
import org.springframework.validation.annotation.Validated;
2021

21-
import javax.validation.constraints.NotEmpty;
22-
2322
@ConfigurationProperties(prefix="spring.graphql.jpa.query")
2423
@Validated
2524
public class GraphQLJpaQueryProperties {
@@ -28,13 +27,13 @@ public class GraphQLJpaQueryProperties {
2827
* Provides the name of GraphQL schema. This is required attribute.
2928
*/
3029
@NotEmpty
31-
private String name;
30+
private String name = "Query";
3231

3332
/**
3433
* Provides the description of GraphQL schema. Cannot be null.
3534
*/
3635
@NotEmpty
37-
private String description;
36+
private String description = "Query description";
3837

3938
/**
4039
* Enable or disable distinct parameter.

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

Lines changed: 7 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -2,25 +2,18 @@
22

33
import graphql.GraphQL;
44
import graphql.schema.GraphQLSchema;
5-
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
5+
import org.springframework.beans.factory.ObjectProvider;
6+
import org.springframework.boot.autoconfigure.AutoConfiguration;
67
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
78
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
9+
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
810
import org.springframework.boot.context.properties.EnableConfigurationProperties;
911
import org.springframework.context.annotation.Bean;
10-
import org.springframework.context.annotation.Configuration;
11-
import org.springframework.context.annotation.PropertySource;
12-
import org.springframework.context.annotation.PropertySources;
1312

14-
import java.util.List;
15-
16-
@Configuration
17-
@ConditionalOnClass(GraphQL.class)
13+
@AutoConfiguration(after = GraphQLSchemaBuilderAutoConfiguration.class)
1814
@EnableConfigurationProperties(GraphQLJpaQueryProperties.class)
19-
@PropertySources(value= {
20-
@PropertySource("classpath:com/introproventures/graphql/jpa/query/boot/autoconfigure/default.properties"),
21-
@PropertySource(value = "classpath:graphql-jpa-autoconfigure.properties", ignoreResourceNotFound = true)
22-
})
23-
@AutoConfigureAfter(GraphQLSchemaBuilderAutoConfiguration.class)
15+
@ConditionalOnClass(GraphQL.class)
16+
@ConditionalOnProperty(name="spring.graphql.jpa.query.enabled", havingValue="true", matchIfMissing=true)
2417
public class GraphQLSchemaAutoConfiguration {
2518

2619
@Bean
@@ -33,16 +26,14 @@ public GraphQLShemaRegistration graphQLShemaRegistration() {
3326
@ConditionalOnMissingBean(GraphQLSchema.class)
3427
public GraphQLSchemaFactoryBean graphQLSchemaFactoryBean(GraphQLJpaQueryProperties properties,
3528
GraphQLShemaRegistration graphQLShemaRegistration,
36-
List<GraphQLSchemaConfigurer> graphQLSchemaConfigurers) {
29+
ObjectProvider<GraphQLSchemaConfigurer> graphQLSchemaConfigurers) {
3730
for (GraphQLSchemaConfigurer configurer : graphQLSchemaConfigurers) {
3831
configurer.configure(graphQLShemaRegistration);
3932
}
4033

4134
return new GraphQLSchemaFactoryBean(graphQLShemaRegistration.getManagedGraphQLSchemas())
4235
.setQueryName(properties.getName())
4336
.setQueryDescription(properties.getDescription());
44-
45-
4637
};
4738

4839
}

0 commit comments

Comments
 (0)