RFC 7807 Problem Details und konsistente Fehlerantworten
Geben Sie strukturierte Fehlerdaten gemäß RFC 7807 mit dem ProblemDetail von Spring 6 zurück.
RFC 7807 Problem Details und konsistente Fehlerantworten ist eine kostenlose Java Academy-Lektion auf CoddyKit. Dies ist Lektion 4 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des Java Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der Java Academy-Kurs umfasst insgesamt 4 Lektionen.
Was ist RFC 7807?
RFC 7807 „Problem Details for HTTP APIs“ definiert ein standardisiertes JSON-Format für Fehlerantworten. Dadurch sind keine individuellen Fehlerformate für jede API erforderlich, und Clients erhalten eine vorhersehbare Struktur zur Verarbeitung.
Felder von RFC 7807
Standardfelder: type (URI zur Identifizierung des Problems), title (menschenlesbare Zusammenfassung), status (HTTP-Statuscode), detail (spezifische Erklärung), instance (URI des konkreten Auftretens).
{
"type": "https://api.example.com/errors/not-found",
"title": "Resource Not Found",
"status": 404,
"detail": "User with id 42 does not exist.",
"instance": "/api/users/42"
}ProblemDetail in Spring 6
Spring 6 und Spring Boot 3 bieten integrierte Unterstützung für ProblemDetail. Geben Sie ProblemDetail aus Exception-Handlern zurück oder verwenden Sie ErrorResponseException.
import org.springframework.http.ProblemDetail;
@ExceptionHandler(ResourceNotFoundException.class)
public ProblemDetail handleNotFound(ResourceNotFoundException ex, HttpServletRequest req) {
ProblemDetail pd = ProblemDetail.forStatusAndDetail(HttpStatus.NOT_FOUND, ex.getMessage());
pd.setType(URI.create("https://api.example.com/errors/not-found"));
pd.setTitle("Resource Not Found");
pd.setInstance(URI.create(req.getRequestURI()));
return pd;
}Benutzerdefinierte Erweiterungen hinzufügen
ProblemDetail unterstützt Erweiterungseigenschaften über setProperty(key, value) für domänenspezifische Details wie Fehlercodes oder Feldfehler.
ProblemDetail pd = ProblemDetail.forStatus(HttpStatus.BAD_REQUEST);
pd.setTitle("Validation Failed");
pd.setProperty("errors", fieldErrors); // custom extension
pd.setProperty("timestamp", Instant.now());RFC 7807 für Spring MVC aktivieren
Aktivieren Sie ProblemDetail für alle integrierten Spring-Exceptions, indem Sie spring.mvc.problemdetails.enabled=true in application.properties setzen. Spring verpackt Standard-Exceptions (404, 405 usw.) anschließend automatisch im RFC-7807-Format.
# application.properties:
spring.mvc.problemdetails.enabled=trueErrorResponseException
Werfen Sie ErrorResponseException im Service-Code, um eine RFC-7807-Antwort ohne Handler-Methode zu erzeugen – Spring MVC fängt die Exception ab und formatiert sie.
throw new ErrorResponseException(HttpStatus.CONFLICT,
ProblemDetail.forStatusAndDetail(HttpStatus.CONFLICT,
"Email already exists: " + email), null);Benutzerdefinierte ProblemDetail-Unterklasse
Erstellen Sie eine domänenspezifische Unterklasse von ProblemDetail, um typisierte Erweiterungsfelder hinzuzufügen und den Code der Handler übersichtlich zu halten.
public class ValidationProblemDetail extends ProblemDetail {
private final Map<String, String> fieldErrors;
public ValidationProblemDetail(Map<String, String> errors) {
super(HttpStatus.BAD_REQUEST.value());
this.fieldErrors = errors;
setTitle("Validation Failed");
setProperty("fieldErrors", errors);
}
}Content-Type: application/problem+json
RFC-7807-Antworten sollten den Content-Type application/problem+json verwenden, damit Clients Problemmeldungen von normalen JSON-Nutzdaten unterscheiden können.
return ResponseEntity.status(HttpStatus.NOT_FOUND)
.contentType(MediaType.APPLICATION_PROBLEM_JSON)
.body(pd);Checkliste für eine konsistente Fehlerstruktur
Eine gute Fehler-API umfasst: (1) eine maschinenlesbare Typ-URI, (2) einen menschenlesbaren Titel, (3) den exakten HTTP-Statuscode, (4) eine spezifische Detailnachricht, (5) die URI der Anfrageinstanz und (6) optionale Erweiterungsfelder (Zeitstempel, traceId, Feldfehler).
Trace-IDs für die Beobachtbarkeit
Fügen Sie die Trace-ID der Anfrage (aus Micrometer Tracing oder MDC) als Erweiterungseigenschaft hinzu, damit Entwickler Fehlerprotokolle der jeweils fehlerhaften Anfrage zuordnen können.
pd.setProperty("traceId", MDC.get("traceId"));
pd.setProperty("timestamp", Instant.now());Problem Details testen
Prüfen Sie in @WebMvcTest-Tests, dass der Content-Type der Antwort application/problem+json ist und JSON-Felder wie status, title und detail den erwarteten Werten entsprechen.
mockMvc.perform(get("/api/users/999"))
.andExpect(status().isNotFound())
.andExpect(content().contentType("application/problem+json"))
.andExpect(jsonPath("$.status").value(404))
.andExpect(jsonPath("$.title").value("Resource Not Found"));Kurzer Test
Welche Spring-Boot-Eigenschaft aktiviert RFC 7807 für integrierte Spring-MVC-Exceptions?
Zusammenfassung
RFC 7807 standardisiert JSON-Fehlerantworten mit den Feldern type, title, status, detail und instance. Spring 6 stellt ProblemDetail und ErrorResponseException bereit. Aktivieren Sie die Unterstützung mit spring.mvc.problemdetails.enabled=true. Fügen Sie traceId und timestamp als Erweiterungen hinzu, um die Beobachtbarkeit zu verbessern.
Lerne Java mit einem KI-Tutor — kostenlos
Schreibe und führe echten Code in deinem Browser aus, bekomme sofortige Hilfe von einem 24/7 KI-Tutor und setze dein Lernen im Web oder in der App fort.
- Kurse
- 104
- Lektionen
- 374
Häufig gestellte Fragen
Ist die Lektion „RFC 7807 Problem Details und konsistente Fehlerantworten“ kostenlos?
Ja — der vollständige Text von „RFC 7807 Problem Details und konsistente Fehlerantworten“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des Java Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der Java Academy-Kurs umfasst insgesamt 4 Lektionen.
Was lerne ich in „RFC 7807 Problem Details und konsistente Fehlerantworten“?
Geben Sie strukturierte Fehlerdaten gemäß RFC 7807 mit dem ProblemDetail von Spring 6 zurück. Du übst Java Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.
Brauche ich Erfahrung, um Java Academy zu starten?
Keine Vorkenntnisse erforderlich. Java Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 4 von 4.
Wie lange dauert die Lektion „RFC 7807 Problem Details und konsistente Fehlerantworten“?
Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.
Kann ich in dieser Java Academy-Lektion Code schreiben und ausführen?
Ja. Jede Java Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.
Alle Lektionen in diesem Kurs
- Bean Validation: @NotNull, @Size, @Pattern
- Eigene Constraint-Annotationen
- Globale Ausnahmebehandlung mit @ControllerAdvice
- RFC 7807 Problem Details und konsistente Fehlerantworten