Definir nuevos tipos de datos escalares en GraphQL

Publicado por pico.dev el .
blog-stack java planeta-codigo programacion
Comentarios

GraphQL

GraphQL es una alternativa a una interfaz REST con las ventajas de permitir al consumidor obtener únicamente los datos que requiere y realizar varias consultas en una misma petición.

GraphQL por defecto soporta un conjunto de tipos escalares en los datos entre los que están varios numéricos, cadenas, booleanos, enumerados además de los tipos o estructuras de datos definidos en la interfaz del servicio. Sin embargo, si es necesario es posible definir nuevos tipos de datos escalares como podría ser el caso de un tipo de dato para representar una fecha fecha y otro de importe monetario.

El objeto en Java que representa una fecha con Java 8 sería LocalDate y la clase para el importe monetario podría ser un BigDecimal o alguna de la librería JavaMoney.

Para que GraphQL soporte un nuevo tipo de dato escalar es necesario implementar una clase que realice la conversión. Esta clase se encarga de realizar la conversión entre el escalar añadido a una representación a devolver en las respuestas de las peticiones y la conversión entre la representación en consultas al tipo de dato hay que proporcionar al servicio. La clase debe implementar la interfaz Coercing y construyendo un objeto GraphQLScalarType proporcionárselo a GraphQL en la definición del servicio.

Al definir el esquema se proporciona con el método scalars una lista con los tipos de datos escalares adicionales, en este caso una instancia de GraphQLScalarType con una instancia de LocalDateCoercing. Además en el descriptor del esquema hay que declarar el nuevo escalar con la palabra clave scalar.

Añadiendo al tipo Book una fecha de publicación usando este nuevo tipo escalar al realizar una consulta y devolver el dato se realiza la conversión.

El código fuente completo del ejemplo puedes descargarlo del repositorio de ejemplos de Blog Bitix alojado en GitHub y probarlo en tu equipo ejecutando el comando ./gradlew run.