diff --git a/README.md b/README.md index fd47ad9d..b348ee91 100644 --- a/README.md +++ b/README.md @@ -2,6 +2,156 @@ Experimental project to create [GraphQL](https://graphql.org/) support for Spring applications. +[![Build status](https://ci.spring.io/api/v1/teams/spring-graphql/pipelines/spring-graphql/jobs/build/badge)](https://ci.spring.io/teams/spring-graphql/pipelines/spring-graphql) + + +## Getting started + +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:spring-graphql-web` dependency. + +`build.gradle` snippet: +```groovy +dependencies { + implementation 'org.springframework.experimental:spring-graphql-web: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: +```xml + + + org.springframework.experimental + spring-graphql-web + 0.1.0-SNAPSHOT + + + + + org.springframework.boot + spring-boot-starter-web + + + + org.springframework.boot + spring-boot-starter-webflux + + + + + + + spring-milestones + Spring Milestones + https://repo.spring.io/milestone + + + spring-snapshots + Spring Snapshots + https://repo.spring.io/snapshot + + true + + + +``` + +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. + +```java +@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. + + +## Features + +### Core configuration +The Spring GraphQL project offers a few configuration properties to customize your application: + +````properties +# 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. + +### Metrics + +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`: +```properties +management.endpoints.web.exposure.include=health,metrics,info +``` + +You can then check those metrics at `http://localhost:8080/actuator/metrics/graphql.query`. + + +## Sample application + +This repository contains a sample application that the team is using to test new features and ideas. + +You can run it by cloning this repository and typing on the command line: + +```shell script +$ ./gradlew :graphql-sample:bootRun +``` + ## License