Introducción a GraphQL API con Java
GraphQL es un lenguaje de consultas para API que permite a los clientes solicitar solo los datos que realmente necesitan. A diferencia de REST, donde cada endpoint devuelve una estructura de datos fija, GraphQL ofrece flexibilidad y reduce la cantidad de solicitudes. En este tutorial crearemos una API GraphQL completa en Java utilizando Spring Boot y la biblioteca graphql-java. Aprenderás cómo configurar el proyecto, definir el esquema, escribir resolvers y manejar consultas y mutaciones. Todos los ejemplos de código están listos para ejecutarse.
1. Configuración del proyecto y dependencias
Para empezar, crearemos un nuevo proyecto Spring Boot. Usaremos Maven, pero puedes adaptar el ejemplo a Gradle. Agrega las siguientes dependencias en pom.xml:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId></dependency><dependency> <groupId>com.graphql-java</groupId> <artifactId>graphql-java</artifactId> <version>21.0</version></dependency><dependency> <groupId>com.graphql-java</groupId> <artifactId>graphql-java-spring-boot-starter-webmvc</artifactId> <version>2021-06-28T00-00-00-6e3b7b2</version></dependency>Después de agregar las dependencias, crea la clase principal de la aplicación:
@SpringBootApplicationpublic class GraphqlApplication { public static void main(String[] args) { SpringApplication.run(GraphqlApplication.class, args); }}Ahora configuraremos el punto de entrada de GraphQL. Crea el archivo application.yml en la carpeta resources:
graphql: servlet: mapping: /graphql enabled: true cors-enabled: true¡Listo! La estructura básica del proyecto se está ejecutando. A continuación, pasamos a definir el esquema.
2. Definición del esquema GraphQL
El esquema es el núcleo de una API GraphQL. Describe los tipos de datos, las consultas y las mutaciones. Crearemos el 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 deleteBook(id: ID!): Boolean}Aquí hemos definido:
- Book — un objeto con los campos id, title, author y year.
- Query — puntos de entrada para lectura de datos (lista de libros y búsqueda por ID).
- Mutation — operaciones de modificación de datos (agregar y eliminar libro).
Ahora necesitamos cargar este esquema en la aplicación. Crearemos una clase de configuración:
import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import graphql.GraphQL;import graphql.schema.GraphQLSchema;import graphql.schema.idl.RuntimeWiring;import graphql.schema.idl.SchemaGenerator;import graphql.schema.idl.SchemaParser;import graphql.schema.idl.TypeDefinitionRegistry;
import java.io.File;import java.io.IOException;
@Configurationpublic class GraphqlConfig {
@Bean public GraphQL graphQL() throws IOException { File schemaFile = new File("src/main/resources/schema.graphqls"); TypeDefinitionRegistry typeRegistry = new SchemaParser().parse(schemaFile); RuntimeWiring wiring = buildWiring(); GraphQLSchema schema = new SchemaGenerator().makeExecutableSchema(typeRegistry, wiring); return GraphQL.newGraphQL(schema).build(); }
private RuntimeWiring buildWiring() { return RuntimeWiring.newRuntimeWiring() .type(