Introducción a GraphQL y Java
GraphQL es un lenguaje de consulta moderno para API, desarrollado por Facebook. A diferencia de REST, donde cada endpoint devuelve una estructura de datos fija, GraphQL permite al cliente solicitar exactamente los campos que necesita. Esto reduce el volumen de datos transferidos y simplifica el desarrollo de interfaces complejas.
En este tutorial crearemos una API GraphQL simple con Java utilizando Spring Boot y la biblioteca graphql-java. Aprenderás cómo configurar el proyecto, definir el esquema, implementar resolvers y probar la API. El artículo está orientado a principiantes, por lo que avanzaremos paso a paso.
Para trabajar necesitarás: JDK 11+, Maven o Gradle, IDE (IntelliJ IDEA, Eclipse) y conocimientos básicos de Java.
1. Configuración del proyecto Spring Boot
Empecemos creando un nuevo proyecto Spring Boot. La forma más sencilla es usar Spring Initializr. Selecciona las siguientes dependencias:
- Spring Web
- Spring Boot DevTools
- Lombok (opcional, para simplificar el código)
Después de generar el proyecto, agrega en pom.xml (o build.gradle) la dependencia 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>Estas bibliotecas simplificarán la integración de GraphQL con Spring Boot. Después de actualizar las dependencias, ejecuta el proyecto con el comando mvn spring-boot:run o a través del IDE.
2. Definición del esquema GraphQL
El esquema es la base de una API GraphQL. Describe los tipos de datos, consultas (queries) y mutaciones (mutations). Crea un archivo schema.graphqls en la carpeta 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}Aquí hemos definido el tipo Book con los campos obligatorios id, title, author y el campo opcional year. Query contiene dos consultas: obtener todos los libros y un libro por ID. Mutation permite agregar nuevos libros.
Observa el signo de exclamación: indica un campo obligatorio (non-null).
3. Implementación de resolvers
Los resolvers son clases Java que conectan el esquema con los datos. Crearemos una clase Book como modelo de datos:
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;}Ahora crearemos un servicio para almacenar libros (en un proyecto real aquí se conectaría a la base de datos):
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 y paz", "León Tolstói", 1869)); books.add(new Book("2", "Crimen y castigo", "Fiódor Dostoyevski", 1866)); }
public List<Book> getAllBooks() { return books; }
public Optional<Book> getBookById(String id) { return books.str