Hallo.
Dies ist eine Reihe von TODO-Apps mit Java + Spring, aber ab diesem Zeitpunkt werden wir endlich die Ausnahmebehandlung implementieren.
Ich möchte von einem relativ einfachen Ort aus beginnen, um mich an die Ausnahmebehandlung zu gewöhnen. Schauen wir uns also die Ausnahmebehandlung beim Zugriff auf eine nicht vorhandene ID an!
1: [Grundlegendes zu den Super-Grundlagen] Eine kurze Beschreibung von MVC 2: [Vorlage vorbereiten] Ich möchte eine Vorlage mit Spring Initializr erstellen und eine Hallo-Welt erstellen 3: [Verbindung / Einstellungen / Datenanzeige mit MySQL] Temporäre Daten in MySQL speichern-> Alle abrufen-> Oben anzeigen 4: [POST-Funktion] Implementierung der Posting-Funktion 5: [PATCH-Funktion] TODO-Anzeige umschalten 6: [Einfach zu verwendendes JpaRepository] Implementierung der Suchfunktion [7: [Häufig mit Thymeleaf-Vorlagenfragmenten] Header erstellen] (https://qiita.com/nomad_kartman/items/8c33eca2880c43a06e40) [8: [PUT-Funktion] Implementierung der Bearbeitungsfunktion] (https://qiita.com/nomad_kartman/items/66578f3f91a422f9207d) [9: [Tweak] TODO-Anzeige in chronologischer Reihenfolge sortieren + Fälligkeitsdatum auf heutiges Datum setzen] (https://qiita.com/nomad_kartman/items/5ee2b13a701cf3eaeb15) 10: [Ausnahmebehandlung mit Spring] Eine kurze Zusammenfassung der Ausnahmebehandlung 11: [Ausnahmebehandlung mit Feder] Ausnahmebehandlung beim Zugriff auf TODO mit nicht vorhandener ID (jetzt hier)
Übrigens habe ich in Letzter Artikel kurz erklärt, was Ausnahmebehandlung ist.
Zusammenfassend
Sicherheit durch Weiterleiten an eine bestimmte Fehlerseite, wenn der Benutzer eine unbeabsichtigte Anfrage des Erstellers stellt (Eingabe von mehr Zeichen als bei der Registrierung von TODO angegeben, Versuch, auf eine nicht vorhandene URL zuzugreifen ... usw.) Verbessern Sie die Oberfläche und Benutzerfreundlichkeit.
Es bedeutet das.
Dieses Mal implementieren wir es, wenn Sie den Zugriff auf TODO mit einer nicht vorhandenen ID anfordern.
com/example/todo/TodoController.java
@GetMapping("/edit/{id}")
public String showEdit(Model model, @PathVariable("id") long id ) {
TodoEntity editTarget = todoService.findTodoById(id);
model.addAttribute( "editTarget" , editTarget);
return "edit";
}
Ausnahmeverarbeitung beim Aufruf dieses showEdit
. todoService.findTodoById (id)
ruft TODO über die Service-Klasse ab, aber schauen wir uns findTodoById ()
an.
com/example/todo/TodoService.java
public TodoEntity findTodoById(Long todoId) {
Optional<TodoEntity> todoResult = todoRepository.findById(todoId);
return todoResult.get();
}
Die ID wird aus dem Repository durchsucht, das TODO wird erfasst und als optionaler Typ zurückgegeben.
Wenn Sie jedoch versuchen, mit einer ID zu suchen, die hier nicht vorhanden ist, schlägt dies mit einem Fehler fehl, also zu diesem Zeitpunkt
** Wenn todoResult leer ist, führen Sie zu einer bestimmten Ausnahmeklasse **
Du solltest es tun!
com/example/todo/exception/TodoNotFoundException.java
package com.example.todo.exception;
public class TodoNotFoundException extends RuntimeException{
}
Erstellen Sie ein neues Verzeichnis mit dem Namen "Ausnahme" und erstellen Sie eine Klasse mit dem Namen "TodoNotFoundException".
erweitert
bedeutet, dass diese Klasse von RuntimeException
erbt.
Durch das Erben kann die Methode "RunttimeException" auch in dieser Klasse verwendet werden. (Ich werde es dieses Mal nicht benutzen ...)
com/example/todo/TodoService.java
public TodoEntity findTodoById(Long todoId) {
Optional<TodoEntity> todoResult = todoRepository.findById(todoId);
todoResult.orElseThrow(TodoNotFoundException::new);
return todoResult.get();
}
Werfen wir einen Blick auf die eine Zeile, die wir vor der Rückkehr hinzugefügt haben!
Durch Festlegen von "Optional.orElseThrow (Exception name :: new)" können Sie den Prozess zur angegebenen Klasse überspringen, wenn der optionale Typ leer ist. (Diesmal die TodoNotFoundException, die ich zuvor gemacht habe)
Übrigens wird der Teil von Exception name :: new
als Methodenreferenz bezeichnet und bezieht sich auf die Methode als Argument der Methode.
Dieser Artikel ist hilfreich. Schauen Sie also bitte vorbei.
Die zuvor erstellte "TodoNotFoundException" hat gerade die "RuntimeException" geerbt und der Inhalt war leer.
com/example/todo/exception/TodoNotFoundException.java
package com.example.todo.exception;
public class TodoNotFoundException extends RuntimeException{
}
Hier implementieren wir mithilfe der Annotation @ControllerAdvice die Verarbeitung **, wenn ** TodoNotFoundException aufgerufen wird (= wenn sie ausgelöst wird) **.
com/example/todo/exception/TodoControllerAdvice.java
package com.example.todo.exception;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseStatus;
@Slf4j
@ControllerAdvice
public class TodoControllerAdvice {
@ResponseStatus(HttpStatus.NOT_FOUND)
@ExceptionHandler(TodoNotFoundException.class)
public String idNotFound() {
log.warn("Das angegebene TODO kann nicht gefunden werden.");
return "error/404.html";
}
}
Erstellen wir eine solche Klasse im Verzeichnis exception
.
In der Reihenfolge von oben zu erklären ...
templates/error/404.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>404</title>
</head>
<body>
404!
</body>
</html>
Normalerweise sollte der Fehlerinhalt angezeigt werden, diesmal ist es einfach 404! Ich möchte nur anzeigen.
Nun, ich habe alles auf einmal erklärt, daher mag es verwirrend sein, aber das Folgende ist eine Zusammenfassung dieses Prozesses.
・ Benutzer fordert Todo edit an (800 / edit / 100)
↓
-Der Controller sendet den Prozess auf Anfrage an die Serviceklasse (findTodoById (100)).
↓
↓
- TodoControllerAdvice
mit @ControllerAdvice gibt ein Protokoll mit der Aufschrift "Das angegebene TODO kann nicht gefunden werden" aus und wechselt zu 404.html.
Es ist so!
Es kann etwas schwierig sein zu verstehen, ob es sich um einen Satz handelt. Ich denke, Sie sollten den Artikel [hier] lesen (https://dkssksk.com/springbootxceptionhandler/).
Wir werden das nächste Mal weiterhin die Ausnahmebehandlung implementieren!
Recommended Posts