Introdução ao GraphQL e Java
GraphQL é uma linguagem de consulta moderna para APIs, desenvolvida pelo Facebook. Diferente do REST, onde cada endpoint retorna uma estrutura de dados fixa, o GraphQL permite que o cliente solicite exatamente os campos de que precisa. Isso reduz o volume de dados transmitidos e simplifica o desenvolvimento de interfaces complexas.
Neste tutorial, criaremos uma API GraphQL simples em Java usando Spring Boot e a biblioteca graphql-java. Você aprenderá como configurar o projeto, definir o esquema, implementar resolvers e testar a API. O artigo é voltado para iniciantes, então vamos avançar passo a passo.
Para trabalhar, você precisará de: JDK 11+, Maven ou Gradle, IDE (IntelliJ IDEA, Eclipse) e conhecimentos básicos de Java.
1. Configuração do projeto Spring Boot
Vamos começar criando um novo projeto Spring Boot. A maneira mais fácil é usar o Spring Initializr. Selecione as seguintes dependências:
- Spring Web
- Spring Boot DevTools
- Lombok (opcional, para simplificar o código)
Após gerar o projeto, adicione ao pom.xml (ou build.gradle) a dependência para 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>Essas bibliotecas simplificarão a integração do GraphQL com o Spring Boot. Após atualizar as dependências, execute o projeto com o comando mvn spring-boot:run ou através da IDE.
2. Definição do esquema GraphQL
O esquema é a base da API GraphQL. Ele descreve os tipos de dados, consultas (queries) e mutações (mutations). Crie um arquivo schema.graphqls na pasta 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}Aqui definimos o tipo Book com os campos obrigatórios id, title, author e o campo opcional year. Query contém duas consultas: obter todos os livros e obter um livro por ID. Mutation permite adicionar novos livros.
Observe o ponto de exclamação — ele indica um campo obrigatório (non-null).
3. Implementação dos resolvers
Resolvers são classes Java que conectam o esquema aos dados. Vamos criar a classe Book como modelo de dados:
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;}Agora, criaremos um serviço para armazenar os livros (em um projeto real, aqui haveria uma conexão com o banco de dados):
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", "Guerra e Paz", "Liev Tolstói", 1869)); books.add(new Book("2", "Crime e Castigo", "Fiódor Dostoiévski", 1866)); }
public List<Book> getAllBooks() { return books; }
public Optional<Book> getBookById(String id) { return books.str