[JAVA] Personnalisez la réponse aux erreurs de l'API REST avec Spring Boot (Partie 2)

Aperçu

J'ai essayé de personnaliser la réponse au moment de l'erreur avec Spring Boot, je la décrirai donc ici comme un mémorandum. Dans l'article précédent (https://qiita.com/Keisuke1119/items/d13302582fbf933b5fa4), j'ai défini ma propre exception et essayé de gérer cette exception, mais cette fois j'ai essayé de gérer l'exception, mais cette fois c'est une exception définie par Spring. Je voudrais décrire la poignée de.

Contexte

J'ai pu compléter l'exception d'origine définie dans l'article précédent, mais lorsque l'exception définie par Spring au début de l'exception MethodArgumentNotValidException s'est produite, le contenu de l'erreur a été renvoyé avec une partie de corps nulle. Cette fois, je résumerai la cause et la politique de contre-mesure.

Conditions préalables

environnement

Cause

«Une introduction complète au développement d'applications Spring Java avec Spring Framework» déclare comme suit. Je vais citer ci-dessous.

ResponseEntityExceptionHandler implémente la méthode @ExceptionHandler qui gère les exceptions qui se produisent dans le processus de framework Spring MVC. En d'autres termes, vous pouvez gérer toutes les exceptions qui se produisent dans le traitement du framework simplement en créant une classe comme celle ci-dessus. Si vous créez simplement une classe qui hérite de la classe ResponseEntityExceptionHandler, le corps de la réponse répondra avec une erreur dans l'état de. Si vous créez simplement une classe qui hérite de ResponseEntityExceptionHandler, le corps de la réponse répondra vide. Remplacez la méthode handleExceptionInternal si vous souhaitez afficher des informations d'erreur dans le corps de la réponse.

Maintenant, nous connaissons la cause directe. Dans Article précédent, le traitement des descripteurs pour les exceptions d'origine a été implémenté, mais le traitement des descripteurs est défini pour toutes les exceptions définies par Spring. Je pense que la partie du corps a été effacée même si une exception s'est produite parce qu'elle ne l'était pas. (= Au stade de la définition de la classe de handle qui hérite de ResponseEntityExceptionHandler, il semble que vous deviez définir non seulement l'exception d'origine mais aussi la méthode de handle lorsque d'autres exceptions se produisent. Je ne suis pas très familier avec ce domaine. Veuillez me dire les détails ...)

Cette fois, je l'ai vérifié dans la base de code.

Si vous cochez la méthode handleMethodArgumentNotValid qui gère la MethodArgumentNotValidException de la classe parente ResponseEntityExceptionHadler, null est explicitement passé à la partie du corps, et lorsque vous déboguez, ce processus est passé.

ResponseEntityExceptionHadler.java


protected ResponseEntity<Object> handleMethodArgumentNotValid(
			MethodArgumentNotValidException ex, HttpHeaders headers, HttpStatus status, WebRequest request) {

	return handleExceptionInternal(ex, null, headers, status, request);
}

Pour le contenu et l'ordre des arguments de handleExceptionInternal, reportez-vous à Article précédent.

Politique de correspondance

Comme vous pouvez le voir dans ce qui précède, null est explicitement passé à la partie corps de l'argument de la méthode, donc si vous remplacez cette méthode et transmettez le contenu d'erreur que vous souhaitez réellement afficher à la partie corps, il doit être affiché. est. Ensuite, j'aimerais vraiment le déplacer.

Définition du contrôleur

HelloSpringExceptionController.java


package com.example.demo.springExceptionErrorResponse;

import com.example.demo.errorResponse.ErrorDetail;
import com.example.demo.errorResponse.MyException;
import org.springframework.ui.Model;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/springexceptionhandle")
public class HelloSpringExceptionController {

    @RequestMapping("/test")
    public void get(@RequestBody @Validated Person person, Model model) {
    }
}

Définition de classe de modèle

Person.java


package com.example.demo.springExceptionErrorResponse;

import lombok.Data;

import javax.validation.constraints.NotNull;

@Data
public class Person {
    @NotNull
    String firstName;
    @NotNull
    String lastName;
}

Définition de classe de gestionnaire d'exceptions

Cette fois, j'ai simplement passé la chaîne C'est une erreur. ''. Pour cela, essayez de le définir comme vous le souhaitez, par exemple en définissant une classe pour le corps au moment d'une erreur.

SpringExceptionHandler.java


package com.example.demo.springExceptionErrorResponse;

import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.web.context.request.WebRequest;
import org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler;

@RestControllerAdvice
public class SpringExceptionHandler extends ResponseEntityExceptionHandler {
    @Override
    protected ResponseEntity<Object> handleExceptionInternal(
            Exception ex,
            Object object,
            HttpHeaders headers,
            HttpStatus status,
            WebRequest request) {
        return super.handleExceptionInternal(ex, "C'est une erreur.", headers, status, request);
    }
}

Courir

Ci-dessous, essayez de demander JSON à partir de http: // localhost: 8080 / springexceptionhandle / test avec POST. Cette demande doit entraîner une erreur car la contrainte @ NotNull a été appliquée à firstName pour Person.java.

input.json


{
  "firstName": null,
  "lastName": "Nom"
}

résultat

C'est une erreur.

Ce qui précède est solitaire en tant que corps de réponse, mais si vous souhaitez afficher l'heure à laquelle une erreur s'est produite, le code d'état, etc., répondez comme Article précédent Vous devriez pouvoir le voir en définissant une classe spécifique au corps et en passant une instance de cette classe comme deuxième argument à la méthode super.handleExceptionInternal.

Article associé

Personnaliser la réponse d'erreur de l'API REST avec Spring Boot (Partie 1)

Article de référence

Cette fois, j'ai fait référence à l'article suivant lors de la rédaction de l'article.

[Présentation approfondie du développement d'applications Spring Java avec Spring Framework](https://www.amazon.co.jp/Spring%E5%BE%B9%E5%BA%95%E5%85%A5%E9%96%80- Spring-Framework% E3% 81% AB% E3% 82% 88% E3% 82% 8BJava% E3% 82% A2% E3% 83% 97% E3% 83% AA% E3% 82% B1% E3% 83% BC% E3% 82% B7% E3% 83% A7% E3% 83% B3% E9% 96% 8B% E7% 99% BA-% E6% A0% AA% E5% BC% 8F% E4% BC% 9A % E7% A4% BENTT% E3% 83% 87% E3% 83% BC% E3% 82% BF / dp / 4798142476) Personnalisez la réponse d'erreur de l'API REST créée par Spring Boot Gestion des erreurs avec Spring Boot Gestion des exceptions avec @ RestController de Spring Boot

Recommended Posts

Personnalisez la réponse aux erreurs de l'API REST avec Spring Boot (Partie 2)
Personnalisez la réponse aux erreurs de l'API REST avec Spring Boot (Partie 1)
Hello World (API REST) avec Apache Camel + Spring Boot 2
[Spring Boot] Obtenez des informations utilisateur avec l'API Rest (débutant)
Implémentez une API Rest simple avec Spring Security avec Spring Boot 2.0
Spring avec Kotorin - 4 Conception d'API REST
Test de l'API REST à l'aide de REST Assured Part 2
Implémenter l'API REST avec Spring Boot
Implémenter l'API REST avec Spring Boot et JPA (Application Layer)
Implémenter l'API REST avec Spring Boot et JPA (couche d'infrastructure)
Implémenter l'API REST avec Spring Boot et JPA (Domain Layer Edition)
Implémentez une API Rest simple avec Spring Security & JWT avec Spring Boot 2.0
Implémentez un serveur API Web REST simple avec Spring Boot + MySQL
Changer la demande / réponse de l'API REST Spring Boot de CamelCase à SankeCase
[Débutant] Essayez d'écrire l'API REST pour l'application Todo avec Spring Boot
Créer un serveur API Web avec Spring Boot
Télécharger avec Spring Boot
J'ai créé un domaine api avec Spring Framework. Partie 2
Mappez automatiquement DTO aux entités avec l'API Spring Boot
Étendez Spring Boot DefaultErrorViewResolver pour personnaliser dynamiquement les écrans d'erreur
Un mémorandum lors de la création d'un service REST avec Spring Boot
J'ai créé un domaine api avec Spring Framework. Partie 1
Présentez swagger-ui à l'API REST implémentée dans Spring Boot
Générer un code à barres avec Spring Boot
Hello World avec Spring Boot
Implémenter GraphQL avec Spring Boot
Bonjour tout le monde avec Spring Boot!
Exécutez LIFF avec Spring Boot
Connexion SNS avec Spring Boot
Téléchargement de fichiers avec Spring Boot
Spring Boot commençant par copie
Spring Boot à partir de Docker
Hello World avec Spring Boot
Définir des cookies avec Spring Boot
Test de l'API REST avec REST Assured
Utiliser Spring JDBC avec Spring Boot
Ajouter un module avec Spring Boot
Premiers pas avec Spring Boot
Lier l'API avec Spring + Vue.js
Introduction à Spring Boot, partie 1
Créer un micro service avec Spring Boot
Envoyer du courrier avec Spring Boot
Gérez l'API de date et d'heure Java 8 avec Thymeleaf avec Spring Boot
Essayez d'utiliser l'API de recherche de code postal avec Spring Boot
Découvrons comment recevoir avec Request Body avec l'API REST de Spring Boot
Utiliser l'authentification de base avec Spring Boot
Créons une application Web de gestion de livres avec Spring Boot part1
gRPC sur Spring Boot avec grpc-spring-boot-starter
Créez une application avec Spring Boot 2
Déploiement à chaud avec le développement Spring Boot
Liaison de base de données avec doma2 (Spring boot)
Créons une application Web de gestion de livres avec Spring Boot part3
Spring Boot: exemple de projet d'API Restful
Programmation Spring Boot avec VS Code
Créer une application d'enquête avec Spring Boot
Partie 1: Essayez d'utiliser la connexion OAuth 2.0 prise en charge par Spring Security 5 avec Spring Boot
Comment créer votre propre contrôleur correspondant à / error avec Spring Boot
Créons une application Web de gestion de livres avec Spring Boot part2
Obtenez des résultats de validation avec Spring Boot
API RESTful d'autorisation d'accès au démarrage de printemps
J'ai créé un formulaire de recherche simple avec Spring Boot + GitHub Search API.