[JAVA] Passen Sie die Antwort auf REST-API-Fehler mit Spring Boot an (Teil 2).

Überblick

Ich habe versucht, die Antwort zum Zeitpunkt des Fehlers mit Spring Boot anzupassen, daher werde ich sie hier als Memorandum beschreiben. Im vorherigen Artikel (https://qiita.com/Keisuke1119/items/d13302582fbf933b5fa4) habe ich meine eigene Ausnahme definiert und versucht, diese Ausnahme zu behandeln, aber diesmal habe ich versucht, die Ausnahme zu behandeln, aber diesmal ist es eine Ausnahme, die Spring unabhängig definiert. Ich möchte den Griff von beschreiben.

Hintergrund

Ich konnte die im vorherigen Artikel definierte ursprüngliche Ausnahme ergänzen, aber als die von Spring zu Beginn der Ausnahme "MethodArgumentNotValidException" definierte Ausnahme auftrat, wurde der Fehlerinhalt mit einem Nullkörperteil zurückgegeben. Dieses Mal werde ich die Ursachen- und Gegenmaßnahmenpolitik zusammenfassen.

Voraussetzungen

Umgebung

Ursache

"Eine gründliche Einführung in die Entwicklung von Spring Java-Anwendungen mit dem Spring Framework" lautet wie folgt. Ich werde unten zitieren.

ResponseEntityExceptionHandler implementiert die @ ExcceptionHandler-Methode, die Ausnahmen behandelt, die im Spring MVC-Framework-Prozess auftreten. Mit anderen Worten, Sie können alle Ausnahmen behandeln, die bei der Framework-Verarbeitung auftreten, indem Sie eine Klasse wie die oben beschriebene erstellen. Wenn Sie nur eine Klasse erstellen, die die ResponseEntityExceptionHandler-Klasse erbt, antwortet der Antworttext mit einem Fehler im Status von. Wenn Sie nur eine Klasse erstellen, die ResponseEntityExceptionHandler erbt, antwortet der Antworttext leer. Überschreiben Sie die handleExceptionInternal-Methode, wenn Sie Fehlerinformationen an den Antworttext ausgeben möchten.

Jetzt kennen wir die direkte Ursache. In Vorheriger Artikel wurde die Handle-Verarbeitung für ursprüngliche Ausnahmen implementiert, die Handle-Verarbeitung ist jedoch für alle von Spring definierten Ausnahmen definiert. Ich denke, dass der Körperteil ausgeblendet wurde, auch wenn eine Ausnahme aufgetreten ist, weil dies nicht der Fall war. (= In der Phase der Definition der Handle-Klasse, die "ResponseEntityExceptionHandler" erbt, müssen Sie anscheinend nicht nur die ursprüngliche Ausnahme, sondern auch die Handle-Methode definieren, wenn andere Ausnahmen auftreten. Ich bin mit diesem Bereich nicht sehr vertraut. Bitte sag mir die Details ...)

Dieses Mal habe ich es in der Codebasis überprüft.

Wenn Sie die Methode "handleMethodArgumentNotValid" überprüfen, die die "MethodArgumentNotValidException" der übergeordneten Klasse "ResponseEntityExceptionHadler" behandelt, wird "null" explizit an den Hauptteil übergeben, und beim Debuggen wird dieser Prozess übergeben.

ResponseEntityExceptionHadler.java


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

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

Inhalt und Reihenfolge der Argumente von "handleExceptionInternal" finden Sie unter Vorheriger Artikel.

Korrespondenzpolitik

Wie Sie oben sehen können, wird "null" explizit an den Hauptteil des Arguments der Methode übergeben. Wenn Sie diese Methode überschreiben und den Fehlerinhalt, den Sie tatsächlich anzeigen möchten, an den Körperteil übergeben, sollte er angezeigt werden. ist. Dann möchte ich es tatsächlich verschieben.

Controller-Definition

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

Definition der Modellklasse

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

Definition der Ausnahmebehandlungsklasse

Diesmal habe ich einfach die Zeichenfolge "Es ist ein Fehler" übergeben. Versuchen Sie dazu, es so zu definieren, wie Sie möchten, z. B. indem Sie zum Zeitpunkt eines Fehlers eine Klasse für den Body definieren.

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, "Es ist ein Fehler.", headers, status, request);
    }
}

Lauf

Versuchen Sie unten, JSON von http: // localhost: 8080 / springexceptionhandle / test mit POST anzufordern. Diese Anforderung sollte zu einem Fehler führen, da die Einschränkung "@ NotNull" auf "firstName" für "Person.java" angewendet wurde.

input.json


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

Ergebnis

Es ist ein Fehler.

Das Obige ist als Antworttext einsam, aber wenn Sie die Zeit, zu der ein Fehler aufgetreten ist, den Statuscode usw. anzeigen möchten, antworten Sie wie in Vorheriger Artikel. Sie sollten es sehen können, indem Sie eine körperspezifische Klasse definieren und eine Instanz dieser Klasse als zweites Argument an die Methode "super.handleExceptionInternal" übergeben.

In Verbindung stehender Artikel

Anpassen der REST-API-Fehlerantwort mit Spring Boot (Teil 1)

Referenzartikel

Dieses Mal habe ich beim Schreiben des Artikels auf den folgenden Artikel verwiesen.

[Gründliche Einführung in die Entwicklung von Spring Java-Anwendungen mit Spring Framework](https://www.amazon.co.jp/Spring%E5%BE%B9%E5%BA%95%E5%85%A5%E9%96%80- Frühlingsrahmen% 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) Passen Sie die Fehlerantwort der von Spring Boot erstellten REST-API an Fehlerbehandlung mit Spring Boot Ausnahmen mit @ RestController von Spring Boot behandeln

Recommended Posts

Passen Sie die Antwort auf REST-API-Fehler mit Spring Boot an (Teil 2).
Passen Sie die Antwort auf REST-API-Fehler mit Spring Boot an (Teil 1).
Hallo Welt (REST API) mit Apache Camel + Spring Boot 2
[Spring Boot] Benutzerinformationen mit Rest API abrufen (Anfänger)
Implementieren Sie eine einfache Rest-API mit Spring Security mit Spring Boot 2.0
Feder mit Kotorin --4 REST API Design
REST-API-Test mit REST Assured Part 2
Implementieren Sie die REST-API mit Spring Boot
Implementieren Sie die REST-API mit Spring Boot und JPA (Application Layer).
Implementieren Sie die REST-API mit Spring Boot und JPA (Infrastructure Layer).
Implementieren Sie die REST-API mit Spring Boot und JPA (Domain Layer Edition).
Implementieren Sie eine einfache Rest-API mit Spring Security & JWT mit Spring Boot 2.0
Implementieren Sie einen einfachen Web-REST-API-Server mit Spring Boot + MySQL
Ändern Sie die Spring Boot REST API-Anforderung / Antwort von CamelCase in SankeCase
[Anfänger] Versuchen Sie, die REST-API für die Todo-App mit Spring Boot zu schreiben
Erstellen Sie einen Web-API-Server mit Spring Boot
Mit Spring Boot herunterladen
Ich habe mit Spring Framework eine API-Domain erstellt. Teil 2
Ordnen Sie DTO automatisch Entitäten mit der Spring Boot-API zu
Erweitern Sie Spring Boot DefaultErrorViewResolver, um Fehlerbildschirme dynamisch anzupassen
Ein Memorandum beim Erstellen eines REST-Service mit Spring Boot
Ich habe mit Spring Framework eine API-Domain erstellt. Teil 1
Führen Sie swagger-ui in die in Spring Boot implementierte REST-API ein
Generieren Sie mit Spring Boot einen Barcode
Hallo Welt mit Spring Boot
Implementieren Sie GraphQL mit Spring Boot
Hallo Welt mit Spring Boot!
Führen Sie LIFF mit Spring Boot aus
SNS-Login mit Spring Boot
Datei-Upload mit Spring Boot
Spring Boot beginnt mit dem Kopieren
Spring Boot beginnend mit Docker
Hallo Welt mit Spring Boot
Setzen Sie Cookies mit Spring Boot
REST-API-Test mit REST Assured
Verwenden Sie Spring JDBC mit Spring Boot
Modul mit Spring Boot hinzufügen
Erste Schritte mit Spring Boot
API mit Spring + Vue.js verknüpfen
Einführung in Spring Boot Teil 1
Erstellen Sie mit Spring Boot einen Mikrodienst
Mail mit Spring Boot verschicken
Behandeln Sie die Java 8-Datums- und Uhrzeit-API mit Thymeleaf mit Spring Boot
Versuchen Sie, die Springcode-Such-API mit Spring Boot aufzurufen
Lassen Sie uns herausfinden, wie Sie mit Request Body mit der REST-API von Spring Boot empfangen können
Verwenden Sie die Standardauthentifizierung mit Spring Boot
Erstellen wir eine Buchverwaltungs-Webanwendung mit Spring Boot part1
gRPC auf Spring Boot mit grpc-spring-boot-Starter
Erstellen Sie eine App mit Spring Boot 2
Hot Deploy mit Spring Boot-Entwicklung
Datenbankverknüpfung mit doma2 (Spring Boot)
Lassen Sie uns mit Spring Boot part3 eine Webanwendung für die Buchverwaltung erstellen
Spring Boot: Restful API-Beispielprojekt
Spring Boot Programmierung mit VS Code
Erstellen Sie eine Anfrage-App mit Spring Boot
Teil 1: Versuchen Sie, die von Spring Security 5 unterstützte OAuth 2.0-Anmeldung mit Spring Boot zu verwenden
So erstellen Sie mit Spring Boot einen eigenen Controller, der / error entspricht
Lassen Sie uns mit Spring Boot part2 eine Webanwendung für die Buchverwaltung erstellen
Erhalten Sie Validierungsergebnisse mit Spring Boot
Spring Boot Access Authorization RESTful API
Ich habe ein einfaches Suchformular mit Spring Boot + GitHub Search API erstellt.