GraphQL Java – serverseitige Bibliothek zur Implementierung von GraphQL-APIs in Java
GraphQL Java ist eine leistungsstarke und flexible serverseitige Bibliothek zur Implementierung der GraphQL-Spezifikation in Java. Sie ermöglicht Entwicklern die Erstellung effizienter, typsicherer und leicht erweiterbarer APIs, die Clients die Möglichkeit geben, nur die benötigten Daten anzufragen. Die Bibliothek wird aktiv von der Community unterstützt und von vielen großen Unternehmen in der Produktion eingesetzt.
Hauptfunktionen
- Vollständige Unterstützung der GraphQL-Spezifikation – Implementierung aller Typen, Direktiven, Mutationen, Subscriptions und Fragmente.
- Flexibles Typsystem – Möglichkeit, Schemas sowohl auf Basis von Java-Klassen (code-first) als auch über SDL (schema-first) zu definieren.
- Integrierte Asynchronität – Nutzung von
CompletableFuturefür effiziente Anfrageverarbeitung. - DataLoader – integriertes Hilfsprogramm zur Lösung des N+1-Abfrageproblems und zum Batch-Laden von Daten.
- Testwerkzeuge – integrierte Klassen für Unit-Tests von Schemas und Resolvern.
- Erweiterbarkeit – Unterstützung für benutzerdefinierte Skalare, Direktiven und Validierungswerkzeuge.
Architektur der Bibliothek
Die Bibliothek besteht aus mehreren Schlüsselkomponenten:
- GraphQLSchema – Objekt, das das API-Schema repräsentiert.
- DataFetcher – funktionales Interface zum Abrufen von Daten (Analogon zum Resolver in GraphQL).
- TypeResolver – Interface zur Auflösung polymorpher Typen (Interfaces und Unions).
- ExecutionStrategy – Strategie zur Ausführung von Abfragen (standardmäßig asynchron).
- Instrumentation – Mechanismus zum Einfügen zusätzlicher Logik (Logging, Metriken).
Anwendungsbeispiel
Betrachten wir ein einfaches Beispiel zur Erstellung eines GraphQL-Servers für die Buchverwaltung.
1. Definition des Schemas über SDL
// schema.graphqlstype Query { books: [Book] bookById(id: ID!): Book}
type Book { id: ID! title: String! author: String! year: Int}2. Erstellung von Resolvern
import graphql.schema.DataFetcher;import graphql.schema.DataFetchingEnvironment;
public class BookDataFetcher {
public static DataFetcher<List<Book>> getBooksDataFetcher() { return environment -> { // In einer echten Anwendung würde hier eine Datenbankabfrage stehen return List.of( new Book("1", "1984", "George Orwell", 1949), new Book("2", "Brave New World", "Aldous Huxley", 1932) ); }; }
public static DataFetcher<Book> getBookByIdDataFetcher() { return environment -> { String id = environment.getArgument("id"); // Buch anhand der ID suchen return findBookById(id); }; }}3. Schema zusammenbauen und Abfrage ausführen
import graphql.GraphQL;import graphql.schema.GraphQLSchema;import graphql.schema.idl.RuntimeWiring;import graphql.schema.idl.SchemaParser;import graphql.schema.idl.SchemaGenerator;import graphql.schema.idl.TypeDefinitionRegistry;
public class GraphQLExample { public static void main(String[] args) { // SDL laden String schema = "type Query { books: [Book] } type Book { id: ID! title: String! }"; SchemaParser schemaParser = new SchemaParser(); TypeDefinitionRegistry typeRegistry = schemaParser.parse(schema);
// Runtime Wiring konfigurieren RuntimeWiring wiring = RuntimeWiring.newRuntimeWiring() .type("Query", builder -> builder .dataFetcher("books", BookDataFetcher.getBooksDataFetche Auch in der Bibliothek
Redis-Client in Rust: Vollständige Anleitung zur Arbeit mit der Bibliothek redis-rs
JWT-Token in Swift: Vollständiger Leitfaden zur Arbeit mit JSON Web Tokens
Arbeiten mit Bildern in PHP: Überblick über Bibliotheken und Werkzeuge
node-cron: Aufgabenplaner für JavaScript (Node.js)