2020-11-29 18:53:33 +00:00
2020-11-13 11:50:59 +01:00
2020-08-25 06:34:33 +01:00
2020-11-13 11:51:49 +01:00
2020-11-13 11:50:59 +01:00
2020-11-13 11:50:59 +01:00
2020-07-23 09:40:14 +03:00
2020-11-13 16:14:52 +01:00
2020-11-13 11:52:30 +01:00

Spring GraphQL

Experimental project to create GraphQL support for Spring applications.

Build status

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:

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:

<dependencies>
    <dependency>
        <groupId>org.springframework.experimental</groupId>
        <artifactId>spring-graphql-web</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.

Features

Core configuration

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.

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:

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:

$ ./gradlew :graphql-sample:bootRun

License

This project is released under version 2.0 of the Apache License.

Description
No description provided
Readme 5.9 MiB
Languages
Java 97.9%
CSS 1.2%
Shell 0.7%
HTML 0.2%