Java-Anwendungen mit GraphQL, Teil 1

Seite 6: Das GraphQL-Servlet

Inhaltsverzeichnis

Wenn Schema und Resolver definiert sind, kann der Server GraphQL Abfragen ausführen. Dazu muss man zunächst eine Instanz eines "ausführbaren" Schemas (ExecutableSchema) erzeugen, die aus der Schema-Beschreibung (SDL) und den Resolvern besteht. Mit dem Schema können Entwickler GraphQL-Abfragen innerhalb des Servers ausführen, wie das folgende Listing zeigt:

// Beispiel: GraphQLSchema erzeugen
GraphQLSchema graphQLSchema = SchemaParser.newParser() //
    .file("beeradvisor.graphqls")
    .resolvers(beerAdvisorQueryResolver,
       beerAdvisorMutationResolver,
       beerAdvisorSubscriptionResolver,
       beerFieldResolver)
    .build().makeExecutableSchema();

// Beispiel: Ausführen einer Query per API
GraphQL graphQL = GraphQL.newGraphQL(schema).build();
ExecutionInput executionInput = ExecutionInput.newExecutionInput()
    .query("query { beers { id name ratings { stars } } }").build();
ExecutionResult executionResult = graphQL.execute(executionInput);

Object data = executionResult.getData();

Um die GraphQL-API per HTTP-Endpunkt zu veröffentlichen, verwendet man das GraphQLServlet aus dem Projekt graphql-java-servlet. Das Servlet erwartet die oben gezeigte ausführbare Schemainstanz und stellt dafür einen Endpunkt (üblicherweise "/graphql") zur Verfügung, an den Clients GraphQL-Abfragen schicken können. Das Servlet gibt die Abfrage an das ausführbare Schema weiter und liefert das Ergebnis an den Client zurück. Das Erzeugen und Registrieren des Servlet ist abhängig vom eingesetzten Servlet-Container beziehungsweise Application Server.

Für Spring-Boot-Anwendungen steht mit graphql-spring-boot ein eigenes Starter-Modul zur Verfügung, das das Arbeiten mit dem GraphQL-Framework vereinfacht. Bindet man das Modul in die eigene Anwendung ein, erzeugt es beim Start der Anwendung automatisch eine ausführbare Schemainstanz, die aus allen im Klassenpfad gefundenen SDL-Dateien sowie allen gefunden Resolver-Klassen besteht (diese muss man beispielsweise mit @Component als Spring Bean kennzeichnen). Dafür wird dann automatisch auch das GraphQL Servlet registriert. Auf Wunsch kann man zusätzlich den GraphiQL-Explorer für die eigene API aktivieren.

Mit GraphQL lassen sich Abfragen an eine GraphQL-API schicken, wobei der Client grundsätzlich selber bestimmen kann, welche Daten er lesen möchte. Das Prinzip ist allerdings nicht beliebig flexibel: Die entsprechenden Felder müssen vom Server bereitgestellt und die Logik dafür implementiert werden. Zum Einbinden von GraphQL in eigene Anwendungen gibt es mit dem Open-Source-Projekt graphql-java-tools ein Framework, das ein guter Ausgangspunkt für die serverseitige Implementierung ist.

Der zweite Teil der Artikelserie zeigt am Beispiel einer React-Anwendung, wie man GraphQL clientseitig zum Lesen von Daten einsetzen kann.

Nils Hartmann
ist Softwareentwickler und -architekt aus Hamburg. Er programmiert sowohl in Java als auch in JavaScript beziehungsweise TypeScript und beschäftigt sich mit der Entwicklung von React-basierten Anwendungen. Nils bietet dazu Schulungen und Workshops an. (bbo)