Experimental project to create GraphQL support for Spring applications.
This project is tested against Spring Boot 2.4+, but should work on 2.3 as well.
You can start by creating a project on https://start.spring.io and select the spring-boot-starter-web or spring-boot-starter-webflux starter, depending on the type of web application you'd like to build. Once the project is generated, you can manually add the org.springframework.experimental:graphql-spring-boot-starter dependency.
build.gradle snippet:
dependencies { implementation 'org.springframework.experimental:graphql-spring-boot-starter:0.1.0-SNAPSHOT' // Spring Web MVC starter implementation 'org.springframework.boot:spring-boot-starter-web' // OR Spring WebFlux starter implementation 'org.springframework.boot:spring-boot-starter-webflux' } repositories { mavenCentral() // don't forget to add spring milestone and snapshot repositories maven { url 'https://repo.spring.io/milestone' } maven { url 'https://repo.spring.io/snapshot' } }pom.xml snippet:
<dependencies> <dependency> <groupId>org.springframework.experimental</groupId> <artifactId>graphql-spring-boot-starter</artifactId> <version>0.1.0-SNAPSHOT</version> </dependency> <!-- Spring Web MVC starter --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- OR Spring WebFlux starter --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-webflux</artifactId> </dependency> <!-- ... --> </dependencies> <repositories> <repository> <id>spring-milestones</id> <name>Spring Milestones</name> <url>https://repo.spring.io/milestone</url> </repository> <repository> <id>spring-snapshots</id> <name>Spring Snapshots</name> <url>https://repo.spring.io/snapshot</url> <snapshots> <enabled>true</enabled> </snapshots> </repository> </repositories>You can now add a GraphQL schema in src/main/resources/schema.graphqls such as:
schema { query: QueryType } type QueryType { people: [Person]! } type Person { id: ID! name: String! } And then you should configure the data fetching using a RuntimeWiringCustomizer and custom components like Spring Data repositories, WebClient instances for Web APIs, a @Service bean, etc.
@Component public class PersonDataWiring implements RuntimeWiringCustomizer { private final PersonService personService; public PersonDataWiring(PersonService personService) { this.personService = personService; } @Override public void customize(RuntimeWiring.Builder builder) { builder.type("QueryType", typeWiring -> typeWiring .dataFetcher("people", env -> this.personService.findAll())); } }You can now start your application! A GraphiQL web interface is available at http://localhost:8080/graphql and you can use GraphQL clients to POST queries at the same location.
The Spring GraphQL project offers a few configuration properties to customize your application:
# web path to the graphql endpoint spring.graphql.path=/graphql # location of the graphql schema file spring.graphql.schema-location=classpath:/schema.graphqls # Whether micrometer metrics should be collected for graphql queries management.metrics.graphql.autotime.enabled=trueYou can contribute RuntimeWiringCustomizer beans to the context in order to configure the runtime wiring of your GraphQL application.
If the spring-boot-starter-actuator dependency is on the classpath, metrics will be collected for GraphQL queries. You can see those metrics by exposing the metrics endpoint with application.properties:
management.endpoints.web.exposure.include=health,metrics,infoYou can then check those metrics at http://localhost:8080/actuator/metrics/graphql.query.
This repository contains sample applications that the team is using to test new features and ideas.
You can run them by cloning this repository and typing on the command line:
$ ./gradlew :samples:webmvc-http:bootRun $ ./gradlew :samples:webflux-websocket:bootRunThis project is released under version 2.0 of the Apache License.