Java-Anwendungen mit GraphQL, Teil 1

Das GraphQL-Servlet

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.

Spring Boot

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.