[JAVA] Ich möchte die Standardfehlermeldung von Spring Boot steuern

Zweck

Ich möchte die Standardfehlermeldung steuern, die zurückgegeben wird, wenn ein Fehler in der von Spring Boot erstellten REST-API auftritt.

Hintergrund

Angenommen, Sie haben den folgenden RestController vorbereitet.

MyRestController.java


package demo;

import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class MyRestController {
    
    @RequestMapping(value="/test/{id}")
    private String hello(@PathVariable String id){
        if ("0000".equals(id)) {
            throw new MyCustomException(); //Erwartete Ausnahme
        }
        
        return "Hello world!!";
    }

    @RequestMapping(value="/test-null")
    private String hello(){
        String s = null;
        s.equals("hoge"); //Versehentlicher NPE-Ausbruch
        
        return "Hello world!!";
    }
}

Spring Boot gibt dann standardmäßig die folgende Fehlermeldung zurück.

$ curl http://localhost:8080/test/0000 #Erwarteter MyCustomError
{"timestamp":1526654632290,"status":500,"error":"Internal Server Error","exception":"my.spring.MySpringBootSample.MyCustomError","message":"No message available","path":"/test/0000"}%
$ curl http://localhost:8080/test-null #NPE, die ich versehentlich gelöscht habe
{"timestamp":1526654636310,"status":500,"error":"Internal Server Error","exception":"java.lang.NullPointerException","message":"No message available","path":"/test-null"}%
$ curl http://localhost:8080/wrong-path #Falscher Pfad
{"timestamp":1526654639289,"status":404,"error":"Not Found","message":"No message available","path":"/wrong-path"}%

Es ist jedoch zu cool und für die Sicherheit nicht gut, die NullPointerException zu sehen, die dem Benutzer versehentlich passiert ist. Ich bin auch mit Spring Boot konfrontiert.

Mögliche Fehler kontrollieren

Durch Vorbereiten einer Klasse mit der Annotation "@ ControllerAdvice" ist es möglich, Fehlermeldungen über RestController hinweg zu steuern.

MyControllerAdvice.java


package demo;

import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;

@ControllerAdvice
public class MyControllerAdvice {

    /**
     *Handler, wenn MyCustomException auftritt
     * 
     * @Antwort zurückgeben
     */
    @ExceptionHandler(MyCustomException.class)
    public ResponseEntity<String> handleControllerException() {
        return new ResponseEntity<String>("customized message for MyCustomError.", HttpStatus.INTERNAL_SERVER_ERROR);
    }
}
$ curl http://localhost:8080/test/0000
customized message for MyCustomError.%

Kontrolle gegen unerwartete Fehler

Wenn Sie einen ExceptionHandler erstellen, der Exception.class empfängt, können Sie außerdem eine benutzerdefinierte Fehlermeldung einheitlich für jeden unerwarteten Fehler zurückgeben, der in RestController auftritt.

MyControllerAdvice.java


package demo;

import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;

@ControllerAdvice
public class MyControllerAdvice {

    /**
     *Handler, wenn MyCustomException auftritt
     * 
     * @Antwort zurückgeben
     */
    @ExceptionHandler(MyCustomException.class)
    public ResponseEntity<String> handleControllerException() {
        return new ResponseEntity<String>("customized message for MyCustomError.", HttpStatus.INTERNAL_SERVER_ERROR);
    }
    
    /**
     *Handler, wenn eine Ausnahme auftritt
     * 
     * @Antwort zurückgeben
     */
    @ExceptionHandler(Exception.class)
    public ResponseEntity<String> handleControllerException2() {
        return new ResponseEntity<String>("customized message for any unexpected exception.", HttpStatus.INTERNAL_SERVER_ERROR);
    }
}

Diese Methode steuert jedoch keine Fehler vor der Eingabe von RestController, z. B. falsche Pfade.

$ curl http://localhost:8080/test/0000
customized message for MyCustomError.%
$ curl http://localhost:8080/test-null
customized message for any unexpected exception.%
$ curl http://localhost:8080/wrong-path #Ein Standardfehler wird für einen falschen Pfad zurückgegeben
{"timestamp":1526655182855,"status":404,"error":"Not Found","message":"No message available","path":"/wrong-path"}%

Als ich es nachgeschlagen habe, war es [Official](https://docs.spring.io/spring-boot/docs/1.5.3.RELEASE/reference/html/boot-features-developing-web-applications.html#boot-features -Fehlerbehandlung) hat die folgende Beschreibung.

Spring Boot provides an /error mapping by default that handles all errors in a sensible way, and it is registered as a ‘global’ error page in the servlet container.

Der Punkt ist, dass jeder Fehler standardmäßig unter "/ error" abgebildet wird. Wenn Sie es nach Belieben steuern möchten, realisieren Sie ErrorController, und bereiten Sie die folgende Klasse vor.

MyErrorController.java


package demo;

import org.springframework.boot.autoconfigure.web.ErrorController;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class MyErrorController implements ErrorController {

    @RequestMapping("/error")
    public ResponseEntity<String> handleError() {
        return new ResponseEntity<String>("customized message for any unhandled error.", HttpStatus.INTERNAL_SERVER_ERROR);
    }

    @Override
    public String getErrorPath() {
        return "/error";
    }
}

Dann verschwand die Standardfehlermeldung.

$ curl http://localhost:8080/test/0000
customized message for MyCustomError.%
$ curl http://localhost:8080/test-null
customized message for any unexpected exception.%
$ curl http://localhost:8080/wrong-path
customized message for any unhandled error.%

Recommended Posts

Ich möchte die Standardfehlermeldung von Spring Boot steuern
05. Ich habe versucht, die Quelle von Spring Boot zu löschen
Ich habe versucht, die Kapazität von Spring Boot zu reduzieren
Ich möchte den Ablauf der Spring-Verarbeitungsanforderungsparameter verstehen
Ich möchte die maximale Dateigröße für das Hochladen von Dateien für jede URL in Spring Boot steuern
Die Geschichte der Erhöhung der Spring Boot 1.5-Serie auf die 2.1-Serie
Ich möchte bei der Registrierung in der Datenbank eine Fehlermeldung anzeigen
Ich möchte die Methode des Controllers kennen, bei der die Ausnahme im ExceptionHandler von Spring Boot ausgelöst wurde
Ich möchte die Antwort der Janken-App wissen
Ich möchte die Bildlaufposition von UITableView zurückgeben!
Die Geschichte der Erhöhung von Spring Boot von 1.5 auf 2.1 Serie Teil2
Über die Funktion von Spring Boot aufgrund unterschiedlicher Versionen
Ich möchte die Protokollausgabeeinstellung von UtilLoggingJdbcLogger ändern
[Ruby] Ich möchte die Reihenfolge der Hash-Tabelle umkehren
Nachricht erlöschen (Spring Boot)
Ich möchte die Anzeige der oberen Verwaltungsnavigationsleiste (Steuerungsmenü) in Liferay 7 / DXP steuern
Ich möchte die Farbe des Steuerungsmenüs oben in Liferay 7 / DXP ändern
Die Geschichte von Collectors.groupingBy, die ich für die Nachwelt behalten möchte
Ich habe versucht, die Fehlermeldung beim Ausführen von Eclipse (Java) zu übersetzen.
Was ich bei der Migration von der Spring Boot 1.4-Serie zur 2.0-Serie getan habe
Ich möchte die Eingabe begrenzen, indem ich den Zahlenbereich einschränke
Was ich bei der Migration von der Spring Boot 1.5-Serie zur 2.0-Serie getan habe
Ich möchte den Wert von Attribute in Selenium of Ruby ändern
Ich möchte doppelte Fehlermeldungen beseitigen
[Spring Boot] Ich möchte meine eigene Eigenschaftendatei hinzufügen und den Wert mit env.getProperty () abrufen.
Ich möchte den Rahmen des Textfelds rot machen, wenn ein Eingabefehler auftritt
So teilen Sie eine Spring Boot-Nachrichtendatei
Ich möchte JSP in Emacs einfacher als die Standardeinstellung schreiben.
Spring Boot + MyBatis Ich erhalte diesen Fehler, wenn ich die Datenbank nicht einstelle
Schritte zum Ausführen von Spring Boot beziehen sich auf die Werte in der Eigenschaftendatei
Ich möchte die JSP des offenen Portlets bei der Entwicklung von Liferay kennen
[Ruby] Ich möchte nur den Wert des Hash und nur den Schlüssel extrahieren
Ich habe Docker verwendet, um die Vorlage zu verfestigen, die mit Spring Boot entwickelt werden soll.
Ich möchte das Argument der Annotation und das Argument der aufrufenden Methode an den Aspekt übergeben
Mein Memorandum, dass ich ValidationMessages.properties UTF8 in Spring Boot erstellen möchte
Ich möchte den Feldnamen des [Java] -Felds erhalten. (Alter Ton)
Ich möchte, dass Sie Enum # name () für den Schlüssel von SharedPreference verwenden
So finden Sie die Ursache des Ruby-Fehlers
[FCM] Implementierung der Nachrichtenübertragung mit FCM + Spring Boot
Ich wollte Spring Boot in einem Multiprojekt gradle
[Spring Boot] So verweisen Sie auf die Eigenschaftendatei
Ich möchte den Wert in Ruby erhalten
Ich möchte den Wert von Cell unabhängig vom CellType (Apache POI) transparent erhalten.
03. Ich habe eine Anfrage von Spring Boot an die Postleitzahlensuch-API gesendet
Wenn Sie irgendwo einen Fehler melden möchten, wenn Sie graphql-spring-boot mit Spring Boot verwenden
Ich habe versucht, eine Webanwendung voller Fehler mit Spring Boot zu klonen
Ab Spring Boot 2.3 enthält die Standardfehlerseite keine detaillierten Fehlerinformationen mehr
So legen Sie Umgebungsvariablen in der Eigenschaftendatei der Spring-Boot-Anwendung fest
[Ruby on Rails] So japanisieren Sie die Fehlermeldung des Formularobjekts (ActiveModel)
Ich möchte den Inhalt der Anfrage sehen, ohne vier oder fünf zu sagen
Ich möchte rekursiv die Oberklasse und die Schnittstelle einer bestimmten Klasse erhalten