Spring Boot GraphQL Query Operation

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 Postmanin the query section add the below query

query FindAllApple {
    findAllApple {
        appleId
        appleName
        available
        price
        appleType
        tastes
        vendor {
            vendorId
            vendorName
            available
        }
    }
}

follow us on