The Spring Boot GraphQL Query Operation
is equivalent to HTTP GET
in Rest API
, it is used to request the data and get the result in a response. Spring Boot GraphQL Query Operation
is POST
in nature. a sample GraphQL Query Operation
looks like as below.
query FindAllApple {
findAllApple {
appleId
appleName
available
price
}
}
Spring Boot GraphQL assumes everything as a query by default, hence the query keyword is optional
GraphQL
Schema Definition
for above Query Operation
looks like as below
# Apple Object
type Apple{
# primary key of apple
appleId:ID!
# apple Name
appleName:String!
# apple availability
available: Boolean
# apple Price
price:Float
# apple Name Enumeration
appleType:AppleType
# apple Vendor
vendor:Vendor
# apple Taste
tastes:[String]
}
# Apple Query
type Query{
# query to get all apples
findAllApple:[Apple]
}
GraphQL Query
is a tree of fields. The top-level
fields are called root fields
and child fields
are known as subselection fields
.
GraphQL only returns the fields mentioned in Query, its application for sub-section Objects as well.
Spring Boot GraphQL Query
works with arguments
, variables
, fragments
, and interfaces
. It uses JSON Schema
structure but with keys
only.
All the fields
in Query
are verified against the GraphQL schema
and throw an error
if the name is mismatched.
package org.wesome.graphql.controllers;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.graphql.data.method.annotation.QueryMapping;
import org.springframework.stereotype.Controller;
import org.wesome.graphql.entity.Apple;
import org.wesome.graphql.service.AppleService;
import java.util.List;
@Controller
public class AppleGraphQLController {
@Autowired
private AppleService appleService;
@QueryMapping("findAllApple")
List<Apple> findAllApple() {
return appleService.findAllApple();
}
}
package org.wesome.graphql.entity;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Apple {
private int appleId;
private String appleName;
private Boolean available;
private Float price;
private List<String> tastes;
private AppleType appleType;
private Vendor vendor;
}
package org.wesome.graphql.entity;
public enum AppleType {
MACINTOSH, FUJI, GALA, JONAGOLD
}
package org.wesome.graphql.entity;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Vendor {
private int vendorId;
private String vendorName;
private Boolean available;
}
package org.wesome.graphql.service;
import org.wesome.graphql.entity.Apple;
import java.util.List;
public interface AppleService {
List<Apple> findAllApple();
}
package org.wesome.graphql.service;
import org.springframework.stereotype.Service;
import org.wesome.graphql.entity.Apple;
import org.wesome.graphql.entity.AppleType;
import org.wesome.graphql.entity.Vendor;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
@Service
public class AppleServiceImpl implements AppleService {
private static final List<String> tastes = Arrays.asList("sweet", "sour", "bitter", "salty", "savory");
private static Vendor vendor = new Vendor(1, "vendor A", true);
private static final List<Apple> apples = new ArrayList<>(List.of(new Apple(1, "macintosh", true, 1.1F, tastes, AppleType.MACINTOSH, vendor), new Apple(2, "fuji", false, 2.2F, tastes, AppleType.FUJI, vendor), new Apple(3, "gala", true, 3.3F, tastes, AppleType.GALA, vendor), new Apple(4, "jonagold", false, 4.4F, tastes, AppleType.JONAGOLD, vendor)));
@Override
public List<Apple> findAllApple() {
return apples;
}
}
package org.wesome.graphql;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class GraphqlProjectApplication {
public static void main(String[] args) {
SpringApplication.run(GraphqlProjectApplication.class, args);
}
}
\src\main\resources\graphql\schema.graphqls
# Apple Enumeration
enum AppleType {
MACINTOSH, FUJI, GALA, JONAGOLD
}
# Apple Object
type Apple{
# primary key of apple
appleId:ID!
# apple Name
appleName:String!
# apple availability
available: Boolean
# apple Price
price:Float
# apple Name Enumeration
appleType:AppleType
# apple Vendor
vendor:Vendor
# apple Taste
tastes:[String]
}
# Vendor Object
type Vendor{
# primary key of Vendor
vendorId:ID!
# vendor name
vendorName:String
#vendor availability
available:Boolean
}
# Apple Query
type Query{
# query to get all apples
findAllApple:[Apple]
}
\src\main\resources\application.properties
spring.graphql.graphiql.enabled=true
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.1.5</version>
<relativePath/>
</parent>
<groupId>org.wesome</groupId>
<artifactId>spring-boot-graphql</artifactId>
<version>0.0.1-snapshot</version>
<name>spring-boot-graphql</name>
<description>implementing graphql in spring boot</description>
<properties>
<java.version>17</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-graphql</artifactId>
</dependency>
<dependency>
<groupId>com.graphql-java</groupId>
<artifactId>graphql-java-extended-scalars</artifactId>
<version>21.0</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webflux</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.graphql</groupId>
<artifactId>spring-graphql-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
GraphiQL
GraphQL
provides an inbuild UserInterface GraphiQL
, which can be accessed via http://localhost:8080/graphiql
or access GraphQL via Postman,
in the query section add the below query
query FindAllApple {
findAllApple {
appleId
appleName
available
price
appleType
tastes
vendor {
vendorId
vendorName
available
}
}
}