Bonjour.
Il s'agit d'une série de création d'applications TODO avec Java + Spring, mais à partir de ce moment, nous allons enfin implémenter la gestion des exceptions.
Je veux partir d'un endroit relativement facile pour m'habituer à la gestion des exceptions, alors jetons un coup d'œil à la gestion des exceptions lors de l'accès à un ID inexistant!
1: [Comprendre les super bases] Une brève description de MVC 2: [Préparer un modèle] Je veux créer un modèle avec Spring Initializr et créer un monde Hello 3: [Connexion / Paramètres / Affichage des données avec MySQL] Enregistrer les données temporaires dans MySQL-> Tout obtenir-> Afficher en haut 4: [Fonction POST] Implémentation de la fonction de publication 5: [Fonction PATCH] Basculer l'affichage TODO 6: [Easy to use JpaRepository] Implémentation de la fonction de recherche [7: [Commun avec les fragments de modèle Thymeleaf] Créer un en-tête] (https://qiita.com/nomad_kartman/items/8c33eca2880c43a06e40) [8: [Fonction PUT] Implémentation de la fonction d'édition] (https://qiita.com/nomad_kartman/items/66578f3f91a422f9207d) [9: [Tweak] Trier l'affichage TODO dans l'ordre chronologique + Régler la date d'échéance à la date d'aujourd'hui] (https://qiita.com/nomad_kartman/items/5ee2b13a701cf3eaeb15) 10: [Gestion des exceptions avec le ressort] Un bref résumé de la gestion des exceptions 11: [Gestion des exceptions avec ressort] Gestion des exceptions lors de l'accès à TODO avec un ID inexistant (maintenant ici)
En passant, dans Dernier article, j'ai brièvement expliqué ce qu'est la gestion des exceptions.
En résumé
Sécurité en dirigeant vers une page d'erreur spécifique lorsque l'utilisateur fait une demande involontaire du créateur (saisie de plus de caractères que spécifié lors de l'enregistrement de TODO, tentative d'accès à une URL inexistante ... etc) Améliorez la surface et la convivialité.
Cela signifie que.
Cette fois, nous l'implémenterons lorsque vous demanderez l'accès à TODO avec un identifiant qui n'existe pas.
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";
}
Traitement des exceptions lors de l'appel de ce showEdit ''.
todoService.findTodoById (id) obtient TODO via la classe Service, mais jetons un coup d'œil à
findTodoById () ''.
com/example/todo/TodoService.java
public TodoEntity findTodoById(Long todoId) {
Optional<TodoEntity> todoResult = todoRepository.findById(todoId);
return todoResult.get();
}
L'ID est recherché dans le référentiel, le TODO est acquis et il est renvoyé en tant que type facultatif.
Cependant, si vous essayez de rechercher avec un ID qui n'existe pas ici, cela échouera avec une erreur, donc à ce moment
** Si todoResult est vide, conduit à une classe d'exception spécifique **
Tu devrais le faire!
com/example/todo/exception/TodoNotFoundException.java
package com.example.todo.exception;
public class TodoNotFoundException extends RuntimeException{
}
Créez un nouveau répertoire appelé ʻexception`` et créez-y une classe appelée
`TodoNotFoundException``.
ʻExtends`` signifie que cette classe hérite de
`RuntimeException. En héritant, la méthode de
RunttimeException '' peut également être utilisée dans cette classe. (Je ne vais pas l'utiliser cette fois ...)
com/example/todo/TodoService.java
public TodoEntity findTodoById(Long todoId) {
Optional<TodoEntity> todoResult = todoRepository.findById(todoId);
todoResult.orElseThrow(TodoNotFoundException::new);
return todoResult.get();
}
Jetons un coup d'œil à la ligne que nous avons ajoutée avant de revenir!
En définissant ʻOptional.orElseThrow (Nom d'exception :: new)
`, vous pouvez passer le processus à la classe spécifiée lorsque le type facultatif est vide. (Cette fois, j'ai fait `` TodoNotFoundException '')
Au fait, la partie de `ʻException name :: new`` est appelée une référence de méthode, et elle fait référence à la méthode comme argument de la méthode.
Cet article sera utile, alors jetez un œil.
Le TodoNotFoundException
que vous avez créé plus tôt vient d'hériter de RuntimeException
et le contenu était vide.
com/example/todo/exception/TodoNotFoundException.java
package com.example.todo.exception;
public class TodoNotFoundException extends RuntimeException{
}
Ici, en utilisant l'annotation @ControllerAdvice, nous implémenterons le traitement ** lorsque ** TodoNotFoundException est appelé (= quand il est lancé) **.
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("Le TODO spécifié est introuvable.");
return "error/404.html";
}
}
Créons une classe comme celle-ci dans le répertoire `ʻexception``.
Pour expliquer dans l'ordre du haut ...
templates/error/404.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>404</title>
</head>
<body>
404!
</body>
</html>
Normalement, le contenu de l'erreur devrait être affiché, mais cette fois il s'agit simplement de 404! Je veux juste afficher.
Cela peut être déroutant parce que j'ai tout expliqué en même temps, mais ce qui suit est un résumé de ce processus.
・ L'utilisateur demande à modifier (800 / modifier / 100)
↓
-Le contrôleur envoie le processus à la classe de service sur demande (findTodoById (100))
↓
-Comme il n'y a pas de TODO avec ID = 100, `` TodoNotFoundException '' est appelé.
↓
- TodoControllerAdvice
avec @ControllerAdvice génère un journal disant "Le TODO spécifié est introuvable" et passe à 404.html.
C'est comme ça!
Il peut être un peu difficile de comprendre s'il s'agit d'une phrase, donc je pense que vous devriez lire l'article ici.
Nous continuerons à implémenter la gestion des exceptions la prochaine fois!
Recommended Posts