Ein REST-Controller verbindet HTTP mit dem Anwendungskern. Er sollte nicht die gesamten Fachregeln enthalten. DTOs beschreiben Daten an der Transportgrenze. Bean Validation prüft einfache Eingabeanforderungen. Das Lernprojekt nimmt einen Titel entgegen und gibt einen normalisierten Wert zurück. Es besitzt noch keinen dauerhaften Speicher und ist keine Kopie der geschützten PDF-Server-API.
01Das Serverprojekt starten
Speichere beide Dateien in einem neuen Ordner. mvn spring-boot:run startet auf Port 8282. Spring Boot 4.1 und Java 21 entsprechen der geprüften PDF-Codebasis. Der Lernserver bleibt lokal.
<project xmlns="http://maven.apache.org/POM/4.0.0">
<modelVersion>4.0.0</modelVersion>
<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>4.1.0</version></parent>
<groupId>example</groupId><artifactId>rest-learning</artifactId><version>1.0</version>
<properties><java.version>21</java.version></properties>
<dependencies>
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency>
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validation</artifactId></dependency>
</dependencies>
<build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build>
</project>
Starten / prüfen
mvn spring-boot:run -Dspring-boot.run.arguments=--server.port=828202DTO und Controller lesen
Ein record bündelt unveränderliche Eingabedaten. @RequestBody liest JSON. @Valid aktiviert die Prüfung von @NotBlank. @PostMapping benennt die Route. ResponseEntity setzt den HTTP-Status und die Antwort.
package tutorial;
import jakarta.validation.Valid;
import jakarta.validation.constraints.NotBlank;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
@SpringBootApplication
@RestController
public class Application {
record Input(@NotBlank String title) {}
record Output(String title) {}
@PostMapping("/normalise")
ResponseEntity<Output> normalise(@Valid @RequestBody Input input) {
return ResponseEntity.ok(new Output(input.title().trim()));
}
public static void main(String[] args) { SpringApplication.run(Application.class, args); }
}
03Einen echten Request senden
Führe die curl-Befehle in einem zweiten Terminal aus. Der gültige Request soll 200 liefern. Reine Leerzeichen liefern 400. Die Antwort normalisiert Text, erstellt aber absichtlich keine gespeicherte Ressource. Deshalb verwenden wir hier nicht 201 Created.
curl -i -H 'Content-Type: application/json' -d '{"title":" Letters "}' http://127.0.0.1:8282/normalise
curl -i -H 'Content-Type: application/json' -d '{"title":" "}' http://127.0.0.1:8282/normalise
04Die fachliche Grenze ergänzen
Im realen PDF-Projekt delegiert JobRestController an JobApplicationService. Der Service prüft Zustände, Grenzen und Speicherabläufe. Transportvalidierung ergänzt diese Regeln, ersetzt sie aber nicht. Sicherheit und Uploadbesitz werden im vollständigen Server separat behandelt.
Ein gültiger Titel wird normalisiert. Ein leerer Titel erzeugt HTTP 400.
Deine Übung
Ergänze eine maximale Länge von 60 und teste genau 60 sowie 61 Zeichen.
Lösung mit Erklärung anzeigen
Verwende zusätzlich @Size(max = 60) auf title. Überlege, ob die Länge vor oder nach trim fachlich gilt. Wenn die Regel normalisierten Text betrifft, muss sie im Service nach der Normalisierung geprüft werden.
Projektbezug und Quellen
Das Beispiel ist zum Lernen vereinfacht. Die verlinkte Codeversion zeigt die Anwendung im Projekt und die dortigen Prüfungen.