Architecture

Article

GraphQL meets Java(EE)

Depuis plusieurs années la tendance pour les applications web est d’utiliser le type d’architecture REST pour les communications entre la partie FrontEnd (JavaScript) et le BackEnd. Mais depuis quelques temps, plusieurs challengers sont apparus :

L’objectif de ces solutions est de palier à des problématiques de REST :

  • Multiple échanges nécessaires pour récupérer l’ensemble des informations souhaitées ;
  • Toutes les données obtenues dans une réponse ne sont pas forcément utile à l’appelant.

… et de RPC :

  • Multiplication des endpoints implémentés en fonction des besoins des consommateurs.

GraphQL

GraphQL offre une solution d’interrogation d’API, notamment au travers d’un langage (proche de JSON) et de composants technique de front/back pour différentes technologies[1] : JavaScript, Ruby, Java, .Net, Scala, etc.

Java(EE)

L’objectif de ce billet est de montrer un exemple de mise en œuvre de GraphQL côté backend en technologie Java(EE) :

  1. Exposition d’un endpoint pour recevoir les requêtes GraphQL (contenu dans un document au format JSON) et fournir les résultats (JSON) ;
  2. Utilisation de JPA pour les accès à une base de données ;
  3. CDI pour l’injection de dépendances ;
  4. Application autonome sur la base de Wildfly Swarm.

L’exemple présente deux modèles :

  1. Le modèle annoté JPA pour la persistance ;
  2. Le modèle GraphQL pour le traitement des requêtes.

Modèle GraphQL

L’implémentation du processeur GraphQL (« côté serveur ») traduit les requêtes reçues en appels de méthodes sur le modèle de donnée.

Le modèle GraphQL porte les annotations spécifiques à l’exposition des données et l’interrogation via GraphQL. Pour l’exemple, nous avons fait appel aux composants graphql-java[2] et graphql-java-annotation [3].

Le modèle GraphQL porte également les méthodes prenant en charge les champs « complexes » : listes, connections (« champs paramétrés », filtrage des données), mutations (opérations de modification).

Query Modèle Java
{
 user(id: "1") {
   id
   firstname
 }
}
@GraphQLField
public UserObject user(@GraphQLName(“id”) String id) {
// …
}

La requête exprime la récupération des valeurs des propriétés id et firstname du user dont l’id vaut 1. On retrouve donc dans le modèle une méthode chargée de la récupération d’un élément de ce type à partir d’un identifiant. L’annotation portée par cette méthode permet d’exposer ce filtre (nom, paramètres et types) au niveau de GraphQL.

Des sources de l’exemple sont disponible sur le GitHub de Onepoint et sur :

Nouveau commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

*

Solve : *
11 + 1 =


Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.