Transforming a RESTful Service to GraphQL in Spring Boot
Transforming a RESTful Service to GraphQL in Spring Boot

As businesses grow and their data consumption patterns evolve, it often becomes necessary to migrate from RESTful services to more flexible and efficient GraphQL APIs. GraphQL, developed by Facebook, offers a powerful query language for your API, allowing clients to request exactly the data they need. In this blog post, we will guide you through transforming an existing RESTful service into a GraphQL service using Spring Boot. We will provide a code example, class diagram, and sequence diagram to ensure a comprehensive understanding.

Table of Contents

  1. Overview
  2. Prerequisites
  3. Setting Up the Spring Boot Project
  4. RESTful Service Example
  5. Creating the Corresponding GraphQL Service
  6. Running the Application Locally and Testing with Postman
  7. Class Diagram
  8. Sequence Diagram
  9. Conclusion

1. Overview

We will start with an existing RESTful service that provides employee details and transform it into a GraphQL service. This involves setting up the Spring Boot project, creating the RESTful service, and then implementing the GraphQL equivalent.

2. Prerequisites

  • Java 11+
  • Maven
  • Basic knowledge of Spring Boot and RESTful services
  • Understanding of GraphQL basics
  • Postman for API testing

3. Setting Up the Spring Boot Project

First, create a Spring Boot project using Spring Initializr or your preferred method. Include the following dependencies:

  • Spring Web
  • Spring Data JPA
  • H2 Database (for simplicity)
  • GraphQL Spring Boot Starter
  • GraphQL Java Tools
<dependencies>
    <!-- Spring Boot dependencies -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>
    <dependency>
        <groupId>com.h2database</groupId>
        <artifactId>h2</artifactId>
        <scope>runtime</scope>
    </dependency>
    <!-- GraphQL dependencies -->
    <dependency>
        <groupId>com.graphql-java-kickstart</groupId>
        <artifactId>graphql-spring-boot-starter</artifactId>
    </dependency>
    <dependency>
        <groupId>com.graphql-java-kickstart</groupId>
        <artifactId>graphql-java-tools</artifactId>
    </dependency>
</dependencies>

4. RESTful Service Example

First, we will create a simple RESTful service to fetch employee details.

Entity Class

@Entity
public class Employee {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
    private String role;

    // Getters and Setters
}

Repository Interface

public interface EmployeeRepository extends JpaRepository<Employee, Long> {
}

REST Controller

@RestController
@RequestMapping("/api/employees")
public class EmployeeController {

    @Autowired
    private EmployeeRepository employeeRepository;

    @GetMapping("/{id}")
    public ResponseEntity<Employee> getEmployeeById(@PathVariable Long id) {
        Optional<Employee> employee = employeeRepository.findById(id);
        return employee.map(ResponseEntity::ok)
                       .orElseGet(() -> ResponseEntity.status(HttpStatus.NOT_FOUND).build());
    }
}

5. Creating the Corresponding GraphQL Service

Now, let’s create a GraphQL service to fetch employee details.

GraphQL Schema

Create a file named schema.graphqls in the src/main/resources directory.

type Query {
    employee(id: ID!): Employee
}

type Employee {
    id: ID!
    name: String
    role: String
}

GraphQL Query Resolver

@Component
public class EmployeeQuery implements GraphQLQueryResolver {

    @Autowired
    private EmployeeRepository employeeRepository;

    public Employee getEmployee(Long id) {
        return employeeRepository.findById(id).orElse(null);
    }
}

6. Running the Application Locally and Testing with Postman

Running the Application

To run the Spring Boot application, execute the following command in your terminal from the root directory of your project:

mvn spring-boot:run

The application will start on http://localhost:8080.

Testing the RESTful Service with Postman

  1. Open Postman and create a new GET request.
  2. Enter the URL: http://localhost:8080/api/employees/{id} (replace {id} with an actual employee ID).
  3. Send the Request: Click on the Send button to see the response from the RESTful service.

Testing the GraphQL Service with Postman

  1. Open Postman and create a new POST request.
  2. Enter the URL: http://localhost:8080/graphql.
  3. Set Headers:
    • Key: Content-Type
    • Value: application/json
  4. Enter the Body
{ "query": "{ employee(id: 1) { id name role } }" }

5. Send the Request: Click on the Send button to see the response from the GraphQL service.

    7. Class Diagram

    @startuml
    
    class Employee {
        + Long id
        + String name
        + String role
    }
    
    interface EmployeeRepository {
        + Optional<Employee> findById(Long id)
    }
    
    class EmployeeController {
        - EmployeeRepository employeeRepository
        + ResponseEntity<Employee> getEmployeeById(Long id)
    }
    
    class EmployeeQuery {
        - EmployeeRepository employeeRepository
        + Employee getEmployee(Long id)
    }
    
    EmployeeController --> EmployeeRepository
    EmployeeQuery --> EmployeeRepository
    
    @enduml
    

    8. Sequence Diagram

    @startuml
    
    actor Client
    
    Client -> EmployeeController: GET /api/employees/{id}
    EmployeeController -> EmployeeRepository: findById(id)
    EmployeeRepository -> EmployeeController: Optional<Employee>
    EmployeeController -> Client: ResponseEntity<Employee
    
    Client -> EmployeeQuery: Query { employee(id: ID!) }
    EmployeeQuery -> EmployeeRepository: findById(id)
    EmployeeRepository -> EmployeeQuery: Optional<Employee>
    EmployeeQuery -> Client: Employee
    
    @enduml
    

    9. Conclusion

    By following this guide, you have successfully transformed an existing RESTful service into a GraphQL service using Spring Boot. This new GraphQL API provides more flexibility and efficiency, allowing clients to request only the data they need. Additionally, we’ve included steps to run the application locally and test it using Postman to ensure everything works as expected.

    With this knowledge, you’re now equipped to leverage the power of GraphQL in your Spring Boot applications, improving data fetching efficiency and overall performance.

    Leave a Reply

    Your email address will not be published. Required fields are marked *