Java Academy · Leçon

Détails de problème RFC 7807 et réponses d’erreur cohérentes

Renvoyez des charges utiles d’erreur structurées conformes à la RFC 7807 avec ProblemDetail de Spring 6.

Leçon 4 sur 413 étapes

Détails de problème RFC 7807 et réponses d’erreur cohérentes est une leçon Java Academy gratuite sur CoddyKit. Ceci est la leçon 4 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage Java Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours Java Academy comprend 4 leçons au total.

Qu'est-ce que la RFC 7807 ?

La RFC 7807, « Détails des problèmes pour les API HTTP », définit un format JSON standard pour les réponses d'erreur. Elle évite de créer un format d'erreur personnalisé pour chaque API et fournit aux clients une structure prévisible à analyser.

Champs de la RFC 7807

Champs standard : type (URI identifiant le problème), title (résumé lisible par un humain), status (code d'état HTTP), detail (explication précise), instance (URI de l'occurrence concernée).

{
  "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 dans Spring 6

Spring 6 et Spring Boot 3 intègrent la prise en charge de ProblemDetail. Renvoyez un ProblemDetail depuis les gestionnaires d'exceptions ou utilisez 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;
}

Ajouter des extensions personnalisées

ProblemDetail prend en charge les propriétés d'extension via setProperty(key, value) pour des détails propres au domaine, comme les codes d'erreur ou les erreurs de champ.

ProblemDetail pd = ProblemDetail.forStatus(HttpStatus.BAD_REQUEST);
pd.setTitle("Validation Failed");
pd.setProperty("errors", fieldErrors); // custom extension
pd.setProperty("timestamp", Instant.now());

Activer la RFC 7807 pour Spring MVC

Activez ProblemDetail pour toutes les exceptions Spring intégrées en définissant spring.mvc.problemdetails.enabled=true dans application.properties. Spring encapsule alors automatiquement les exceptions standard (404, 405, etc.) au format RFC 7807.

# application.properties:
spring.mvc.problemdetails.enabled=true

ErrorResponseException

Lancez ErrorResponseException depuis le code du service pour produire une réponse RFC 7807 sans méthode de gestion : Spring MVC l'intercepte et la met en forme.

throw new ErrorResponseException(HttpStatus.CONFLICT,
    ProblemDetail.forStatusAndDetail(HttpStatus.CONFLICT,
        "Email already exists: " + email), null);

Sous-classe ProblemDetail personnalisée

Créez une sous-classe de ProblemDetail propre au domaine afin d'ajouter des champs d'extension typés et de garder le code des gestionnaires clair.

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);
    }
}

Type de contenu : application/problem+json

Les réponses RFC 7807 doivent utiliser le type de contenu application/problem+json afin que les clients puissent distinguer les réponses signalant un problème des charges utiles JSON normales.

return ResponseEntity.status(HttpStatus.NOT_FOUND)
    .contentType(MediaType.APPLICATION_PROBLEM_JSON)
    .body(pd);

Liste de vérification d'une structure d'erreur cohérente

Une bonne API d'erreur fournit : (1) une URI de type lisible par la machine, (2) un titre lisible par un humain, (3) le code d'état HTTP exact, (4) un message de détail précis, (5) l'URI d'instance de la requête, (6) des champs d'extension facultatifs (horodatage, traceId, erreurs de champ).

Identifiants de trace pour l'observabilité

Ajoutez l'identifiant de trace de la requête (provenant de Micrometer Tracing ou de MDC) comme propriété d'extension afin que les ingénieurs puissent mettre en relation les journaux d'erreur avec la requête défaillante concernée.

pd.setProperty("traceId", MDC.get("traceId"));
pd.setProperty("timestamp", Instant.now());

Tester les détails des problèmes

Dans les tests @WebMvcTest, vérifiez que le type de contenu de la réponse est application/problem+json et que les champs JSON comme status, title et detail correspondent aux valeurs attendues.

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"));

Vérification rapide

Quelle propriété Spring Boot active la RFC 7807 pour les exceptions Spring MVC intégrées ?

Récapitulatif

La RFC 7807 standardise les réponses d'erreur JSON avec les champs type, title, status, detail et instance. Spring 6 fournit ProblemDetail et ErrorResponseException. Activez-la avec spring.mvc.problemdetails.enabled=true. Ajoutez traceId et un horodatage comme extensions pour l'observabilité.

Gratuit pour commencer

Apprends Java avec un tuteur IA — gratuit

Écris et exécute du vrai code dans ton navigateur, obtiens de l'aide instantanée d'un tuteur IA disponible 24h/24, et reprends là où tu t'es arrêté sur le web ou dans l'app.

Cours
104
Leçons
374

Questions Fréquemment Posées

La leçon « Détails de problème RFC 7807 et réponses d’erreur cohérentes » est-elle gratuite ?

Oui — le texte complet de « Détails de problème RFC 7807 et réponses d’erreur cohérentes » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours Java Academy, passe à CoddyKit PRO. Le cours Java Academy comprend 4 leçons au total.

Qu'est-ce que j'apprendrai dans « Détails de problème RFC 7807 et réponses d’erreur cohérentes » ?

Renvoyez des charges utiles d’erreur structurées conformes à la RFC 7807 avec ProblemDetail de Spring 6. Tu pratiques Java Academy avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.

Dois-je avoir de l'expérience pour commencer Java Academy ?

Aucune expérience préalable n'est requise. Java Academy sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 4 sur 4.

Combien de temps prend la leçon « Détails de problème RFC 7807 et réponses d’erreur cohérentes » ?

La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.

Peux-tu écrire et exécuter du code dans cette leçon Java Academy ?

Oui. Chaque leçon Java Academy inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.

Toutes les leçons de ce cours

  1. Validation des beans : @NotNull, @Size, @Pattern
  2. Annotations de contrainte personnalisées
  3. Gestion globale des exceptions avec @ControllerAdvice
  4. Détails de problème RFC 7807 et réponses d’erreur cohérentes
← Retour à Java Academy