Spring Boot GraphQL Introspection Operation

Rest API provides a separate contract defining the REST endpoint, HTTP Verb, and Request and Response parameters. Spring Boot GraphQL Introspection Operation provides schema introspection to understand its variables, fields, metadata, arguments, directives, etc.

It helps the client validate the query before executing, GraphQL also provides tools such as GrahphiQL and IDE integration to introspect and provide GUI visualization of Schema Specification.

Learn more about GraphQL Schema Specification

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 record AppleGraphQLController(@Autowired AppleService appleService) {

    @QueryMapping("findAllApple")
    List<Apple> findAllApple() {
        return appleService.findAllApple();
    }
}
package org.wesome.graphql.data;

public enum AppleType {
    MACINTOSH, FUJI, GALA, JONAGOLD
}
package org.wesome.graphql.entity;

import org.wesome.graphql.data.AppleType;

import java.util.List;

public record Apple(int appleId, AppleType appleName, Boolean available, Float price, List<String> tastes) {
}
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.data.AppleType;
import org.wesome.graphql.entity.Apple;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

@Service
public record AppleServiceImpl() implements AppleService {
    private static final List<String> tastes = Arrays.asList("sweet", "sour", "bitter", "salty", "savory");
    private static final List<Apple> apples = new ArrayList<>(List.of(new Apple(1, AppleType.MACINTOSH, true, 1.1F, tastes), new Apple(2, AppleType.FUJI, false, 2.2F, tastes), new Apple(3, AppleType.GALA, true, 3.3F, tastes), new Apple(4, AppleType.JONAGOLD, false, 4.4F, tastes)));

    @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 Object
type Apple{
    # primary key of apple
    appleId:ID!
    # apple Name Enumeration
    appleName:String!
    # apple availability
    available: Boolean
    # apple Price
    price:Float
    # apple Taste
    tastes:[String]
}
# 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

{
    __typename
    __schema {
        __typename
        types {
            kind
            name
            description
            specifiedByUrl
        }
    }
}

follow us on