Créons une application TODO en Java 11 Gestion des exceptions lors de l'accès à un TODO avec un ID inexistant

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!

Collection de liens de création d'application TODO

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)

Pensez à la façon dont la gestion des exceptions est gérée

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.

Flux de traitement des exceptions

Cette fois, nous l'implémenterons lorsque vous demanderez l'accès à TODO avec un identifiant qui n'existe pas.

Vérifiez d'abord le contrôleur

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 () ''.

Vérifiez findTodoById () de la classe Service

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!

Classe d'exception spécifique?

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 ...)

Guide de la classe TodoNotFoundException lorsque todoResult est vide dans findTodoById ()

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.

Créez une classe qui gère TodoNotFoundException.

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 ...

@Slf4j
En utilisant cette annotation, vous pouvez afficher le journal. Vous pouvez afficher le journal dans le terminal avec log.warn ("contenu") ou log.info ("contenu").
@ControllerAdvice
Indique que cette classe est ControllerAdvice. Vous serez en mesure de définir ce qu'il faut faire lorsqu'une exception se produit dans TodoController.
@ResponseStatus(HttpStatus.NOT_FOUND)
Renvoie HttpStatus comme Not_Found.
@ExceptionHandler(TodoNotFoundException.class)
C'est important, mais en utilisant cette annotation, lorsque TodoNotFoundException se produit dans le traitement dans TodoController, cet idNotFound () est spécifié pour être traité. Dans cette fonction, error / 404.html s'affiche lors de la sortie du journal des erreurs.

Créer une page d'erreur

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.

Récapitulatif du flux de traitement des exceptions mis en œuvre cette fois

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

Créons une application TODO en Java 11 Gestion des exceptions lors de l'accès à un TODO avec un ID inexistant
Créons une application TODO en Java 6 Implémentation de la fonction de recherche
Créons une application TODO avec Java 1 Brève explication de MVC
Créons une application TODO en Java 5 Changer l'affichage de TODO
Créons une application TODO avec Java 12 Processing lorsqu'une requête arrive avec une HttpMethod inutilisée ・ Traitement lorsqu'une erreur se produit sur le serveur
Faisons une application de calculatrice avec Java ~ Créez une zone d'affichage dans la fenêtre
Faisons une application TODO avec Java 2 Je veux créer un modèle avec Spring Initializr et créer Hello world
Créer une application TODO dans Java 7 Créer un en-tête
Créons une application TODO dans Java 13 TODO form validation 1: Character limit-Update Gradle to use @Validated
Créons une application TODO avec Java 3 Enregistrez les données temporaires dans MySQL-> Tout obtenir-> Afficher en haut
Créer un CSR avec des informations étendues en Java
Créons un processus chronométré avec la minuterie de Java! !!
Créons un framework Web ultra-simple avec Java
Créons une application TODO en Java 9 Créer un affichage TODO Trier par date et heure + Définir la date d'échéance sur la date actuelle
Techniques de gestion des exceptions en Java
Faisons une application de calcul avec Java ~ Afficher la fenêtre de l'application
Créer un SlackBot avec AWS lambda et API Gateway en Java
Je ne peux pas créer une classe Java avec un nom spécifique dans IntelliJ
Gestion des exceptions avec une interface fluide
Allons-y avec Watson Assistant (anciennement Conversation) ⑤ Créez un chatbot avec Watson + Java + Slack
Créer un environnement de développement d'applications Web Java avec Docker pour Mac Part2
Créez une application Web simple avec Dropwizard
Créons un environnement de développement Java (mise à jour)
Diviser une chaîne avec ". (Dot)" en Java
Créons une bibliothèque d'opérations de stockage de fichiers polyvalente (?) En faisant abstraction du stockage / acquisition de fichiers avec Java
Lire une chaîne dans un fichier PDF avec Java
Créez un tableau d'affichage simple avec Java + MySQL
[Windows] [IntelliJ] [Java] [Tomcat] Créer un environnement pour Tomcat 9 avec IntelliJ
Essayez de créer un babillard en Java
Créer un onglet personnalisé avec SwiftUI 2.0
[Java] Créer une collection avec un seul élément
Une note quand vous voulez Tuple en Java
[Java] Créons un Minecraft Mod 1.14.4 [Introduction]
[Java] Créons un Minecraft Mod 1.14.4 [99. Mod output]
Questions sur la gestion des exceptions Java throw et try-catch
[Azure] J'ai essayé de créer une application Java gratuitement ~ Se connecter avec FTP ~ [Débutant]
Un mémo quand j'ai essayé "Parler d'écrire une application Java dans Eclipse et de la publier dans Kubernetes dans un conteneur Liberty (Partie 1)"
[Java] Gestion des exceptions
☾ Java / Gestion des exceptions
À propos de la gestion des exceptions Java
Gestion des exceptions Java
[Java] Créons un Minecraft Mod 1.14.4 [0. Fichier de base]
[Java] Considérations lors de la gestion des nombres binaires négatifs avec Integer.parseInt ()
[Java] Créons un Minecraft Mod 1.14.4 [4. Ajouter des outils]
Comment créer un environnement Java en seulement 3 secondes
[Java] Créons un Minecraft Mod 1.14.4 [5. Ajouter une armure]
[Java] Créons un Minecraft Mod 1.14.4 [édition supplémentaire]
[Java] Créons un Minecraft Mod 1.14.4 [7. Add progress]
[Java] Créons un Minecraft Mod 1.14.4 [6. Ajouter une recette]
[Java] Créons un Minecraft Mod 1.16.1 [Ajouter un élément]
[Java] Créons un Minecraft Mod 1.16.1 [Fichier de base]
[Bases de Java] Créons un triangle avec une instruction for
[Java] Créons un Minecraft Mod 1.14.4 [1. Ajouter un élément]
Comment créer un URI de données (base64) en Java
Implémentez rapidement singleton avec enum en Java
[Note] Créez un environnement Java à partir de zéro avec docker
Ce que j'ai appris lors de la création d'un serveur en Java
Sortie true avec if (a == 1 && a == 2 && a == 3) en Java (identifiant invisible)
[Java] Créons un Minecraft Mod 1.14.4 [2. Ajouter un bloc]
Créez une application JAVA WEB et essayez OMC APM