Introduction à GraphQL et Java
GraphQL est un langage de requête moderne pour les API, développé par Facebook. Contrairement à REST, où chaque endpoint renvoie une structure de données fixe, GraphQL permet au client de demander exactement les champs dont il a besoin. Cela réduit le volume de données transmises et simplifie le développement d'interfaces complexes.
Dans ce tutoriel, nous allons créer une API GraphQL simple en Java en utilisant Spring Boot et la bibliothèque graphql-java. Vous apprendrez à configurer le projet, définir le schéma, implémenter des résolveurs et tester l'API. L'article est destiné aux débutants, nous allons donc avancer pas à pas.
Pour travailler, vous aurez besoin de : JDK 11+, Maven ou Gradle, un IDE (IntelliJ IDEA, Eclipse) et des connaissances de base en Java.
1. Configuration du projet Spring Boot
Commençons par créer un nouveau projet Spring Boot. Le moyen le plus simple est d'utiliser Spring Initializr. Sélectionnez les dépendances suivantes :
- Spring Web
- Spring Boot DevTools
- Lombok (optionnel, pour simplifier le code)
Après avoir généré le projet, ajoutez dans pom.xml (ou build.gradle) la dépendance pour GraphQL :
<dependency> <groupId>com.graphql-java</groupId> <artifactId>graphql-spring-boot-starter</artifactId> <version>5.0.2</version></dependency><dependency> <groupId>com.graphql-java</groupId> <artifactId>graphql-java-tools</artifactId> <version>5.2.4</version></dependency>Ces bibliothèques simplifieront l'intégration de GraphQL avec Spring Boot. Après avoir mis à jour les dépendances, lancez le projet avec la commande mvn spring-boot:run ou via l'IDE.
2. Définition du schéma GraphQL
Le schéma est la base de l'API GraphQL. Il décrit les types de données, les requêtes (queries) et les mutations (mutations). Créez un fichier schema.graphqls dans le dossier src/main/resources :
type Book { id: ID! title: String! author: String! year: Int}
type Query { books: [Book] bookById(id: ID!): Book}
type Mutation { addBook(title: String!, author: String!, year: Int): Book}Ici, nous avons défini le type Book avec les champs obligatoires id, title, author et le champ optionnel year. Query contient deux requêtes : obtenir tous les livres et un livre par ID. Mutation permet d'ajouter de nouveaux livres.
Notez le point d'exclamation — il indique un champ obligatoire (non-null).
3. Implémentation des résolveurs
Les résolveurs (resolvers) sont des classes Java qui relient le schéma aux données. Créons la classe Book comme modèle de données :
import lombok.AllArgsConstructor;import lombok.Data;import lombok.NoArgsConstructor;
@Data@NoArgsConstructor@AllArgsConstructorpublic class Book { private String id; private String title; private String author; private Integer year;}Créons maintenant un service pour stocker les livres (dans un projet réel, il y aurait une connexion à la base de données) :
import org.springframework.stereotype.Service;import javax.annotation.PostConstruct;import java.util.ArrayList;import java.util.List;import java.util.Optional;import java.util.UUID;
@Servicepublic class BookService { private List<Book> books = new ArrayList<>();
@PostConstruct public void init() { books.add(new Book("1", "Guerre et Paix", "Léon Tolstoï", 1869)); books.add(new Book("2", "Crime et Châtiment", "Fiodor Dostoïevski", 1866)); }
public List<Book> getAllBooks() { return books; }
public Optional<Book> getBookById(String id) { return books.str