Einführung in GraphQL und Java
GraphQL ist eine moderne Abfragesprache für APIs, entwickelt von Facebook. Im Gegensatz zu REST, wo jeder Endpunkt eine feste Datenstruktur zurückgibt, erlaubt GraphQL dem Client, genau die Felder anzufragen, die er benötigt. Dies reduziert die Menge der übertragenen Daten und vereinfacht die Entwicklung komplexer Schnittstellen.
In diesem Tutorial erstellen wir eine einfache GraphQL API in Java mit Spring Boot und der Bibliothek graphql-java. Sie erfahren, wie Sie das Projekt einrichten, das Schema definieren, Resolver implementieren und die API testen. Der Artikel richtet sich an Anfänger, daher gehen wir Schritt für Schritt vor.
Für die Arbeit benötigen Sie: JDK 11+, Maven oder Gradle, eine IDE (IntelliJ IDEA, Eclipse) und grundlegende Java-Kenntnisse.
1. Einrichtung des Spring Boot-Projekts
Beginnen wir mit der Erstellung eines neuen Spring Boot-Projekts. Der einfachste Weg ist die Nutzung von Spring Initializr. Wählen Sie die folgenden Abhängigkeiten:
- Spring Web
- Spring Boot DevTools
- Lombok (optional, zur Codevereinfachung)
Nach der Generierung des Projekts fügen Sie in pom.xml (oder build.gradle) die Abhängigkeit für GraphQL hinzu:
<dependency> <groupId>com.graphql-java</groupId> <artifactId>graphql-spring-boot-starter</artifactId> <version>5.0.2</version></dependency><dependency> <groupId>com.graphql-java</groupId> <artifactId>graphql-java-tools</artifactId> <version>5.2.4</version></dependency>Diese Bibliotheken vereinfachen die Integration von GraphQL mit Spring Boot. Nachdem Sie die Abhängigkeiten aktualisiert haben, starten Sie das Projekt mit dem Befehl mvn spring-boot:run oder über die IDE.
2. Definition des GraphQL-Schemas
Das Schema ist die Grundlage einer GraphQL API. Es beschreibt die Datentypen, Abfragen (queries) und Mutationen (mutations). Erstellen Sie die Datei schema.graphqls im Ordner src/main/resources:
type Book { id: ID! title: String! author: String! year: Int}
type Query { books: [Book] bookById(id: ID!): Book}
type Mutation { addBook(title: String!, author: String!, year: Int): Book}Hier haben wir den Typ Book mit den Pflichtfeldern id, title, author und dem optionalen Feld year definiert. Query enthält zwei Abfragen: Abruf aller Bücher und eines Buches nach ID. Mutation ermöglicht das Hinzufügen neuer Bücher.
Beachten Sie das Ausrufezeichen – es kennzeichnet ein Pflichtfeld (non-null).
3. Implementierung der Resolver
Resolver sind Java-Klassen, die das Schema mit den Daten verbinden. Erstellen wir die Klasse Book als Datenmodell:
import lombok.AllArgsConstructor;import lombok.Data;import lombok.NoArgsConstructor;
@Data@NoArgsConstructor@AllArgsConstructorpublic class Book { private String id; private String title; private String author; private Integer year;}Jetzt erstellen wir einen Service zur Speicherung der Bücher (in einem echten Projekt würde hier eine Datenbankverbindung stehen):
import org.springframework.stereotype.Service;import javax.annotation.PostConstruct;import java.util.ArrayList;import java.util.List;import java.util.Optional;import java.util.UUID;
@Servicepublic class BookService { private List<Book> books = new ArrayList<>();
@PostConstruct public void init() { books.add(new Book("1", "Krieg und Frieden", "Leo Tolstoi", 1869)); books.add(new Book("2", "Verbrechen und Strafe", "Fjodor Dostojewski", 1866)); }
public List<Book> getAllBooks() { return books; }
public Optional<Book> getBookById(String id) { return books.str