Experimental project for GraphQL support in Spring applications with GraphQL Java.
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 or 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> <!-- Don't forget to add spring milestone or snapshot repositories --> <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:
type Query { people: [Person]! } type Person { id: ID! name: String! }
Then you should configure the data fetching process 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("Query", 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=true
You can contribute RuntimeWiringCustomizer
beans to the context in order to configure the runtime wiring of your GraphQL application.
This project also supports WebSocket as a transport for GraphQL requests - you can use it to build Subscription
queries. This use case is powered by Reactor Flux
, check out the samples/webflux-websocket
sample application for more.
To enable this support, you need to configure the spring.graphql.websocket.path
property in your application and have the required dependencies on classpath. In the case of a Servlet application, adding the spring-boot-starter-websocket
should be enough.
WebSocket support comes with dedicated properties:
# Path of the GraphQL WebSocket subscription endpoint. spring.graphql.websocket.path=/graphql/websocket # Time within which the initial {@code CONNECTION_INIT} type message must be received. spring.graphql.websocket.connection-init-timeout=60s
You can contribute WebInterceptor
beans to the application context, so as to customize the ExecutionInput
or the ExecutionResult
of the query. A custom WebInterceptor
can, for example, change the HTTP request/response headers.
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,info
You 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:bootRun
This project is released under version 2.0 of the Apache License.