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.
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.
"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.
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.
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) {
}
}
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;
}
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);
}
}
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"
}
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.
Anpassen der REST-API-Fehlerantwort mit Spring Boot (Teil 1)
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