Spring Boot GraphQL Schema Arguments Default Values

GraphQL API takes Arguments as Input Parameter. GraphQL allows Arguments to have default values as well, if values are passed to an API that will be used otherwise default values will be considered.

package org.wesome.graphql.controllers;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.graphql.data.method.annotation.Argument;
import org.springframework.graphql.data.method.annotation.MutationMapping;
import org.springframework.graphql.data.method.annotation.QueryMapping;
import org.springframework.stereotype.Controller;
import org.wesome.graphql.entity.Apple;
import org.wesome.graphql.entity.AppleVO;
import org.wesome.graphql.service.AppleService;

import java.util.List;
import java.util.Optional;

@Controller
public class AppleGraphQLController {
    @Autowired
    private AppleService appleService;

    @QueryMapping("findAllApple")
    List<Apple> findAllApple() {
        return appleService.findAllApple();
    }

    @QueryMapping("findApple")
    Optional<Apple> findApple(@Argument int appleId) {
        return appleService.findApple(appleId);
    }

    @MutationMapping("addApple")
    Apple addApple(@Argument AppleVO appleVO) {
        return appleService.addApple(appleVO);
    }
}
package org.wesome.graphql.entity;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.EqualsAndHashCode;

@Data
@EqualsAndHashCode
@AllArgsConstructor
public final class Apple {
    private int appleId;
    private String appleName;
    private Boolean available;
}
package org.wesome.graphql.entity;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.EqualsAndHashCode;

@Data
@EqualsAndHashCode
@AllArgsConstructor
public final class AppleVO {
    private String appleName;
    private Boolean available;
}
package org.wesome.graphql.service;

import org.wesome.graphql.entity.Apple;
import org.wesome.graphql.entity.AppleVO;

import java.util.List;
import java.util.Optional;

public interface AppleService {
    List<Apple> findAllApple();

    Optional<Apple> findApple(int appleId);

    Apple addApple(AppleVO appleVO);
}
package org.wesome.graphql.service;

import org.springframework.stereotype.Service;
import org.wesome.graphql.entity.Apple;
import org.wesome.graphql.entity.AppleVO;

import java.util.ArrayList;
import java.util.List;
import java.util.Optional;

@Service
public class AppleServiceImpl implements AppleService {
    private static final List<Apple> apples = new ArrayList<>(List.of(new Apple(1, "macintosh", true), new Apple(2, "fuji", false), new Apple(3, "gala", true), new Apple(4, "jonagold", false)));

    @Override
    public List<Apple> findAllApple() {
        return apples;
    }

    @Override
    public Optional<Apple> findApple(int appleId) {
        return apples.stream().filter(apple -> apple.getAppleId() == appleId).findFirst();
    }

    @Override
    public Apple addApple(AppleVO appleVO) {
        Apple apple = new Apple(apples.size() + 1, appleVO.getAppleName(), appleVO.getAvailable());
        apples.add(apple);
        return apple;
    }
}
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
    # available Boolean
    available:Boolean
    # apple Name
    appleName:String
}

# Apple Input Object
input  AppleVO{
    # available Boolean
    available:Boolean
    # apple Name
    appleName:String
}

# Apple Query
type Query{
    # query to get all apples
    findAllApple:[Apple]
    # query to get apple based on Id
    findApple(appleId:Int = 1):Apple
}

# Apple Mutation
type Mutation{
    # mutation to add an apple
    addApple(appleVO:AppleVO!):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>
            <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
        available
        appleName
    }
}

For Query AppleList based on Id, pass the appleId as an Argument, and use the below query

query FindApple {
    findApple(appleId: 1) {
        appleId
        available
        appleName
    }
}

For Query AppleList based on default values, and use the below query

query FindApple {
    findApple {
        appleId
        available
        appleName
    }
}

follow us on