Introdução ao GraphQL API em Java
GraphQL é uma linguagem de consulta moderna para APIs que permite que os clientes solicitem apenas os dados de que realmente precisam. Ao contrário do REST, onde a estrutura da resposta é fixa, o GraphQL oferece flexibilidade e eficiência. Neste tutorial passo a passo, criaremos uma API GraphQL completa em Java usando a biblioteca popular graphql-java e Spring Boot. Você aprenderá a configurar o servidor, definir o schema, escrever resolvers e executar consultas. Todos os exemplos de código estão prontos para execução.
O que você aprenderá
- Como configurar um projeto Spring Boot para GraphQL
- Como definir o schema GraphQL (tipos, queries, mutations)
- Como escrever resolvers em Java
- Como executar consultas query e mutation
1. Configuração do projeto e dependências
Para começar, criaremos um projeto Spring Boot com Maven. Adicionaremos as dependências necessárias no pom.xml:
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <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></dependencies>Essas bibliotecas fornecem integração do GraphQL com Spring Boot e facilitam o trabalho com schemas. Após adicionar as dependências, atualize o projeto.
Estrutura do projeto
Nosso projeto conterá os seguintes componentes principais:
- Schema GraphQL (arquivo
schema.graphqls) - Modelos de dados (Java POJO)
- Resolvers (manipuladores de consultas)
- Controller para testes
2. Definição do schema GraphQL
Crie o arquivo src/main/resources/schema.graphqls. Nele, descreveremos os tipos de dados e as operações disponíveis. Como exemplo, usaremos o modelo "Livro":
type Book { id: ID! title: String! author: String! year: Int}
type Query { getBook(id: ID!): Book getAllBooks: [Book]}
type Mutation { addBook(title: String!, author: String!, year: Int): Book}Aqui, Book é um tipo de objeto com campos obrigatórios (!). Query define os pontos de entrada para leitura de dados, enquanto Mutation define os pontos para modificação. Observe que, em GraphQL, mutations são usadas para criar, atualizar e excluir dados.
3. Criação de modelos Java e resolvers
Modelo Book
Criaremos uma classe POJO simples Book.java:
public class Book { private String id; private String title; private String author; private int year;
public Book(String id, String title, String author, int year) { this.id = id; this.title = title; this.author = author; this.year = year; }
// getters e setters public String getId() { return id; } public String getTitle() { return title; } public String getAuthor() { return author; } public int getYear() { return year; }}Resolver para Query
Os resolvers conectam o schema aos dados. Criaremos a classe QueryResolver.java:
import com.coxautodev.graphql.tools.GraphQLQueryResolver;import org.springframework.stereotype.Component;import java.util.*;
@Componentpublic class QueryResolver implements GraphQLQueryResolver {
private final List<Book