Pendant le processus de développement Web Java, il y aura inévitablement certaines exceptions du système ou des exceptions artificielles. Comment le gérer avec élégance dans un projet Springboot RESTful?
Analyse: Dans le projet Springboot de style Restful, les objets corporels retournés sont tous des objets corporels, il est donc plus approprié de définir une classe de base de résultats qui contient un statut, un message, des données (résultat de retour de la méthode de demande).
Il sera plus gênant si vous définissez plusieurs classes d'exception pour le traitement. Par exemple, StudentNotexistSexception et StudentExistSexception. . . etc., et le code d'erreur ne peut pas être spécifié, ce qui n'est pas pratique pour le processus frontal en fonction du code d'erreur.
Remarque: le flux de traitement du modèle General Spring MVC est le suivant
Couche générale du contrôleur-> Couche de service-> couche DAO.
1. Couche de contrôleur, accepter les demandes, effectuer un paginage et encapsuler l'objet DTO.
2. Couche de service, logique d'exécution, concurrence de contrôle et transactions.
3.DAO Couche, interagissez avec la base de données.
Utilisez une table étudiante pour décrire le traitement:
1. Définir l'erreur commune enum StudentExceptionnunum
Public Enum StudentExceptionnunum {Student_not_exist (1004, "L'étudiant n'existe pas, veuillez confirmer avant de vérifier"), Student_exist (1005, "Student existe déjà"); Statut entier privé; commentaire de chaîne privée; StudentExceptionNenum (statut entier, commentaire de chaîne) {this.status = statut; this.comment = commentaire; } public Integer getStatus () {Retour Status; } public void setStatus (statut entier) {this.status = statut; } public String getComment () {return commentaire; } public void setComment (string comment) {this.comment = comment; }}2 Définir une classe de résultats de traitement de base demandes
@Datapublic class demandeResult {private String Message; Statut entier privé; données d'objets privés; PUBLIC DECGRESSULT (Message de chaîne, statut entier, données d'objet) {this.message = message; this.status = statut; this.data = data; } public demandeResult (message de chaîne, statut entier) {this.message = message; this.status = statut; } public demandeResult (message de chaîne, statut entier) {this.message = message; this.status = statut; } public demandeResult (message de chaîne, StudentExceptionEnum requestExceptionNenum) {this.Message = message; this.status = requestExceptionnum.getStatus (); } public requestResult () {status = 200; message = "ok"; } public static requestResult ok (objet data) {requestResult result = new demandeResult (); result.setData (données); Résultat de retour; } Exception publique de demande statique (message de chaîne, statut entier) {return new demandeResult (message, statut); } Exception publique de demande statique (message String Message, StudentExceptionEnum requestExceptionNenum) {return new demandeResult (message, requestExceptionEnum); }}3 Étudiant entité
@Datapublic classe étudiant implémente Serializable {private String id; surnom de cordes privées; nom de chaîne privé; Âge privé; Sexe à cordes privées; adresse de chaîne privée; @Override public String toString () {return toStringBuilder.ReflectionToString (this); }}4 Traitez la demande, ajoutez l'étudiant, surnom requis. Seuls les codes d'extrait de service sont affichés ici
@Override public demandeResult addStudent (étudiant étudiant) {if (studentDao.QueryIdByNickName (student.getNickName ()) == null) {StudentDao.AddStudent (étudiant); System.out.println ("Ajouter un succès"); Student = StudentDao.QueryByNickName (Student.GetNickName ()); return requestResult.ok (étudiant); } else {return requestResult.Exception ("utilisateur" + student.getNickName () + "déjà existant", StudentExceptionNum.Student_exist); }}5 Pour le moment, la situation de traitement de base est terminée. Le test de base est effectué ci-dessous
5.1 Ajouter une nouvelle information de camarade de classe
5.2 Ajouter à nouveau pour le faire un test anormal
2. À ce stade, cela est essentiellement fait, mais il sera hostile de le retourner directement à l'avant sans gérer l'exception de base d'exécution. Par conséquent, vous devez définir une classe Global RuntimeException d'exception.
L'annotation clé qui doit être utilisée ici: @ExceptionHandler
Il y a deux usages 1) Ajouter @ExceptionHandler au contrôleur qui gère la demande. À l'heure actuelle, cette méthode ne gérera que l'exception lancée par le contrôleur.
2) Utilisez-le dans la classe globale de gestion des exceptions. La classe globale de gestion des exceptions doit être marquée avec @RestControllerAdvice ou @ControllerAdvice
Nous devons gérer le Global RuntimeException, nous utilisons donc la deuxième méthode. Bien sûr, cela est géré pour les clients. Nous devons encore faire face à cette erreur. Que devons-nous faire? Il est nécessaire d'enregistrer les mauvaises informations pour une analyse et un traitement futures. La journalisation est effectuée ici à l'aide de Logger. Le code est le suivant
@RestControllerAdvicePublic Class BasEExceptionHandler {private static logger logger = loggerfactory.getLogger (BasEExceptionHandler.class); @ExceptionHandler (Value = RuntimeException.Class) Public Dequersult ExceptionHandler (HttpServLetRequest Request, Exception e) {LOGERROR (request, e); Return requestResult.Exception ("L'exception est traitée en interne, l'ingénieur travaille sur les réparations d'urgence, veuillez revenir plus tard ...", 500); } public static void LOGERROR (HttpServleRequest Request, exception e) {logger.error ("Adresse de la demande:" + request.getRequestUl ()); Logger.Error ("Méthode de la demande:" + request.getMethod ()); Logger.Error ("Demande IP:" + getRemoteip (demande)); Logger.Error ("Détails d'erreur:"); StackTraceElement [] error = e.getStackTrace (); for (stackTraceElement stackTraceElement: error) {logger.Error (stackTraceElement.toString ()); }} public static String getRemoteip (request httpServleRequest) {String ip = request.getheader ("x-forwarded-for"); if (ip == null || ip.length () == 0 || "Unknown" .EqualSIgnoreCase (ip)) {ip = request.geTheader ("proxy-client-ip"); } if (ip == null || ip.length () == 0 || "inconnu" .equalsIgnoreCase (ip)) {ip = request.getheader ("wl-proxy-client-ip"); } if (ip == null || ip.length () == 0 || "inconnu" .equalSignoreCase (ip)) {ip = request.getheader ("http_client_ip"); } if (ip == null || ip.length () == 0 || "inconnu" .equalSignoreCase (ip)) {ip = request.getheader ("http_x_forwarded_for"); } if (ip == null || ip.length () == 0 || "Unknown" .EqualsIgnoreCase (ip)) {ip = request.getReMoteadDR (); }} else if (ip.length ()> 15) {string [] ips = ip.split (","); pour (int index = 0; index <ips.length; index ++) {String string = (String) ips [index]; if (! ("Unknown" .EqualSignoreCase (Strip))) {ip = strip; casser; }}} return ip; }}Testez pour voir si cela prend effet:
Modifiez et ajoutez le code d'information de l'élève comme suit:
Public DequersResult AddStudent (étudiant étudiant) {int a = 1/0; if (StudentDao.QueryIdByNickName (Student.GetNickName ()) == NULL) {StudentDao.AddStudent (étudiant); System.out.println ("Ajouter un succès"); Student = StudentDao.QueryByNickName (Student.GetNickName ()); return requestResult.ok (étudiant); } else {return requestResult.Exception ("utilisateur '" + student.getNickName () + "' déjà existé", StudentExceptionNum.Student_exist); }}Effectuer un test
Impression du message d'erreur en arrière-plan
2018-03-26 17: 01: 19.125 Erreur 9136 --- [Nio-8080-EXEC-2] ChdController.BaseExceptionHandler: Adresse de la demande: http: // localhost: 8080 / Demi1 / Student2018-03-26 17: 01: 19.125 Error 9136 --- [Nio-8080-Exec-20 ChdController.BaseExceptionHandler: Méthode de la demande: Post2018-03-26 17: 01: 19.125 Erreur 9136 --- [NIO-8080-EXEC-2] CHDController.BaseExceptionHandler: Demande IP: 0: 0: 0: 0: 0: 0: 0: 0: 0: 12018-03-26 17: 01: 0: 0: 0: 12018-03-26 17: 01: 19.125 9136 --- [NIO-8080-EXEC-2] ChdController.BaseExceptionHandler: Détails d'erreur: 2018-03-26 17: 01: 19.125 Erreur 9136 --- [NIO-8080-EXEC-2] CHDController.baseexceptionHandler: com.huitong.demo.service.studentService.addstudent (Studentservice.java:71) 2018-03-26 17: 01: 19.125 Erreur 9136 --- [Nio-8080-EXEC-2] ChdController.baseexceptionHandler: com.huitong.demo.controller.studentController.Addstudent (StudentController.java:38) 2018-03-26 17: 01: 19.125 Erreur 9136 --- [NIO-8080-EXEC-2] ChdController.baseexceptionHandler: Sun.Reflect.NaTIVEMETHODACTORS Méthode) 2018-03-26 17: 01: 19.125 Erreur 9136 --- [Nio-8080-EXEC-2] ChdController.BaseExceptionHandler: Sun.Reflect.NativemethodAcCetsoRIMPL.Invoke (NATIVEMEMETHODACCESSORIMPL.Java:62) 2018-03-26 17: 01: 19.125 ERRE --- [Nio-8080-EXEC-2] ChdController.BaseExceptionHandler: Sun.Reflect.DelegatingMethodAccessOrimp.invoke (DelegatingMetMethodAccessorimp.java:43) chdController.BaseExceptionHandler: java.lang.reflect.method.invoke (méthode.java:498) 2018-03-26 17: 01: 19.125 Erreur 9136 --- [Nio-8080-EXEC-2] ChdController.Basexception Gandand: org.springframework.web.method.support.invocablehandlermethod.doinvoke (invocableHandlerMeth.java:209) 2018-03-26 17: 01: 19.125 Erreur 9136 --- [Nio-8080-EXEC-2] ChdController.BasEExceptionHandler: org.springframework.web.method.support.invocablehandlermethod.invokeForRequest (invocableHandlerMethod.java:136) 2018-03-26 17: 01: 19.125 Erreur 9136 --- [Nio-8080-Exec-2] ChdController.Basexceptionhandler: org.springframework.web.servlet.mvc.method.annotation.servletinvocablehandlerthod.invokeandhandle (servletinvocablehandlerMethod.java:102) 2018-03-26 17: 01: 19.125 Erreur 9136 --- [Nio-8080-EXEC-2] chdController.baseExceptionHandler: org.springframework.web.servlet.mvc.method.annotation.requestmappinghandleradapter.invokehandlerthod (requestmappinghandleradapter.java:870) 2018-03-26 17: 01: 19.125 erre ChdController.BaseExceptionHandler: org.springframework.web.servlet.mvc.method.annotation.requestmappinghandleradapter.handleinternal (requestmappinghandleradapter.java:776) 2018-03-26 17: 01: 19.125 erre ChdController.BaseExceptionHandler: org.springframework.web.servlet.mvc.method.abstracthandlermethodapter.handle (abstracthandlermethadapter.java:87) 2018-03-26 17: 01: 19.129 Erreur 9136 --- [Nio-8080-Exec-20 chdController.BaseExceptionHandler: org.springframework.web.servlet.dispatcherservlet.dodispatch (Dispatterservlet.java:991) 2018-03-26 17: 01: 19.129 Erreur 9136 --- [Nio-8080-Exec-2] ChdController.Basexceptionhandler: org.springframework.web.servlet.dispatcherservlet.doservice (DispatcherServlet.java:925) 2018-03-26 17: 01: 19.129 Erreur 9136 --- [Nio-8080-EXEC-2] ChdController.BaseexceptionHandler: org.springframework.web.servlet.frameworkServlet.processRequest (frameworkservlet.java:978) 2018-03-26 17: 01: 19.129 Erreur 9136 --- [Nio-8080-Exec-2] ChdController.Basexception Gandand: org.springframework.web.servlet.frameworksservlet.dopost (frameworkservlet.java:881) 2018-03-26 17: 01: 19.129 Erreur 9136 --- [Nio-8080-EXEC-2] ChdController.baseexceptionHandler: javax.servlet.http.httpservlet.service (httpservlet.java:661) 2018-03-26 17: 01: 19.129 Erreur 9136 --- [Nio-8080-EXEC-2] CHDContoller.baseexceptionHandler: org.springframework.web.servlet.frameworksservlet.service (frameworkservlet.java:855) 2018-03-26 17: 01: 19.130 Erreur 9136 --- [Nio-8080-EXEC-2] ChdContoller. javax.servlet.http.httpservlet.service (httpservlet.java:742) 2018-03-26 17: 01: 19.130 Erreur 9136 --- [NIO-8080-EXEC-2] ChdController.baseexceptionHandler: org.apache.catalina.core.applicationfilterchain.internaldofilter (applicationFilterChain.java:231) 2018-03-26 17: 01: 19.130 Erreur 9136 --- [NIO-8080-EXEC-2] ChdController.Basexception Gandand: org.apache.catalina.core.applicationfilterchain.dofilter (ApplicationFilterChain.java:166) 2018-03-26 17: 01: 19.130 Erreur 9136 --- [Nio-8080-EXEC-2] ChdController.BaseexceptionHandler: org.apache.tomcat.websocket.server.wsfilter.dofilter (wsfilter.java:52) 2018-03-26 17: 01: 19.130 Erreur 9136 --- [Nio-8080-EXEC-2] ChdController.BaseexceptionHandler: org.apache.catalina.core.applicationfilterchain.internaldofilter (applicationFilterChain.java:193) 2018-03-26 17: 01: 19.130 Erreur 9136 --- [Nio-8080-EXEC-2] ChdController.Basexception Gandand: org.apache.catalina.core.applicationfilterchain.dofilter (ApplicationFilterChain.java:166) 2018-03-26 17: 01: 19.130 Erreur 9136 --- [Nio-8080-EXEC-2] ChdController.BaseexceptionHandler: com.alibaba.druid.support.http.webstatfilter.dofilter (webstatfilter.java:123) 2018-03-26 17: 01: 19.130 Erreur 9136 --- [NIO-8080-EXEC-2] CHDContoller.Abaseexception Gandleler: org.apache.catalina.core.applicationfilterchain.internaldofilter (applicationFilterChain.java:193) 2018-03-26 17: 01: 19.130 Erreur 9136 --- [Nio-8080-EXEC-2] ChdController.Basexception Gandand: org.apache.catalina.core.applicationfilterchain.dofilter (ApplicationFilterChain.java:166) 2018-03-26 17: 01: 19.130 Erreur 9136 --- [Nio-8080-EXEC-2] ChdController.BaseexceptionHandler: org.springframework.web.filter.requestContextFilter.DofilteRinternal (requestContextFilter.java:99) 2018-03-26 17: 01: 19.130 Erreur 9136 --- [NIO-8080-EXEC-2] CHDCONTROLLER.SANSEXECTING GANDELLER: org.springframework.web.filter.onceperRequestFilter.Dofilter (OrimeperRequestFilter.java:107) 2018-03-26 17: 01: 19.130 Erreur 9136 --- [NIO-8080-EXEC-2] CHDCONTROLLER.FASEEXECTING GANDELLER: org.apache.catalina.core.applicationfilterchain.internaldofilter (applicationFilterChain.java:193) 2018-03-26 17: 01: 19.130 Erreur 9136 --- [Nio-8080-EXEC-2] ChdController.Basexception Gandand: org.apache.catalina.core.applicationfilterchain.dofilter (ApplicationFilterChain.java:166) 2018-03-26 17: 01: 19.130 Erreur 9136 --- [Nio-8080-EXEC-2] ChdController.BaseexceptionHandler: org.springframework.web.filter.httputformContentFilter.DofilteRinternal (httpputformContentFilter.java:109) 2018-03-26 17: 01: 19.130 Erreur 9136 --- [NIO-8080-EXEC-2] CHDCONTROLLER.BASEEXCTIVESHAGHLER: org.springframework.web.filter.onceperRequestFilter.Dofilter (OrimeperRequestFilter.java:107) 2018-03-26 17: 01: 19.130 Erreur 9136 --- [NIO-8080-EXEC-2] CHDCONTROLLER.FASEEXECTING GANDELLER: org.apache.catalina.core.ApplicationFilterChain.internaldoFilter (ApplicationFilterChain.java:193) 2018-03-26 17: 01: 19.131 Erreur 9136 --- [Nio-8080-EXEC-2] CHDCONTROLLER.BASEException Gandand: org.apache.catalina.core.applicationfilterchain.dofilter (applicationFilterChain.java:166) 2018-03-26 17: 01: 19.131 Erreur 9136 --- [Nio-8080-EXEC-2] ChdController.BaseexceptionHandler: org.springframework.web.filter.hiddenhttpmethodfilter.dofilterinternal (HiddenhttpMethodFilter.java:81) 2018-03-26 17: 01: 19.131 Erreur 9136 --- [Nio-8080-Exec-2] Chdcondroler.Basexceptionhandler: org.springframework.web.filter.onceperRequestFilter.Dofilter (OrimeperRequestFilter.java:107) 2018-03-26 17: 01: 19.131 Erreur 9136 --- [NIO-8080-EXEC-2] CHDContoller.Abaseexception Gandleler: org.apache.catalina.core.ApplicationFilterChain.internaldoFilter (ApplicationFilterChain.java:193) 2018-03-26 17: 01: 19.131 Erreur 9136 --- [Nio-8080-EXEC-2] CHDCONTROLLER.BASEException Gandand: org.apache.catalina.core.applicationfilterchain.dofilter (applicationFilterChain.java:166) 2018-03-26 17: 01: 19.131 Erreur 9136 --- [Nio-8080-EXEC-2] ChdController.BaseexceptionHandler: org.springframework.web.filter.characterencodingfilter.dofilterinternal (caractéristique encodingfilter.java:200) 2018-03-26 17: 01: 19.131 Erreur 9136 --- [Nio-8080-EXEC-2] ChdContoller.baseexceptionHandler: org.springframework.web.filter.onceperRequestFilter.Dofilter (OrimeperRequestFilter.java:107) 2018-03-26 17: 01: 19.131 Erreur 9136 --- [NIO-8080-EXEC-2] CHDContoller.Abaseexception Gandleler: org.apache.catalina.core.ApplicationFilterChain.internaldoFilter (ApplicationFilterChain.java:193) 2018-03-26 17: 01: 19.131 Erreur 9136 --- [Nio-8080-EXEC-2] CHDCONTROLLER.BASEException Gandand: org.apache.catalina.core.applicationfilterchain.dofilter (applicationFilterChain.java:166) 2018-03-26 17: 01: 19.131 Erreur 9136 --- [Nio-8080-EXEC-2] ChdController.BaseexceptionHandler: org.apache.catalina.core.standardwrappervalve.invoke (standardwrappervalve.java:199) 2018-03-26 17: 01: 19.131 Erreur 9136 --- [Nio-8080-EXEC-2] ChdController.BaseexceptionHandler: org.apache.catalina.core.standardContextValve.invoke (StandardContextValve.java:96) 2018-03-26 17: 01: 19.131 Erreur 9136 --- [Nio-8080-EXEC-2] CHDContoller. org.apache.catalina.authenticator.authenticatorbase.invoke (authenticatorbase.java:496) 2018-03-26 17: 01: 19.131 Erreur 9136 --- [Nio-8080-EXEC-2] ChdController.Basexception Gandand: org.apache.catalina.core.standardhostvalve.invoke (StandardHostValve.java:140) 2018-03-26 17: 01: 19.131 Erreur 9136 --- [Nio-8080-EXEC-2] ChdController.BaseexceptionHandler: org.apache.catalina.valves.errorReportValve.invoke (errorReportValve.java:81) 2018-03-26 17: 01: 19.131 Erreur 9136 --- [Nio-8080-EXEC-2] CHDContoller. org.apache.catalina.core.standardEngineValve.invoke (StandardEngineValve.java:87) 2018-03-26 17: 01: 19.131 Erreur 9136 --- [NIO-8080-EXEC-2] CHDContoller. org.apache.catalina.connector.coyoteadapter.service (coyoteadapter.java:342) 2018-03-26 17: 01: 19.131 Erreur 9136 --- [Nio-8080-EXEC-2] CHDContoller. org.apache.coyote.http11.http11processor.service (http11processor.java:803) 2018-03-26 17: 01: 19.131 Erreur 9136 --- [NIO-8080-EXEC-2] CHDContoller.Abaseexecthandler: org.apache.coyote.abstractProcessorlight.process (AbstractProcessorlight.java:66) 2018-03-26 17: 01: 19.131 Erreur 9136 --- [NIO-8080-EXEC-2] ChdController.baseexceptionHandler: org.apache.coyote.abstractProtoCol $ connectionhandler.process (abstractProtocol.java:790) 2018-03-26 17: 01: 19.131 Erreur 9136 --- [Nio-8080-EXEC-2] CHDContoller. org.apache.tomcat.util.net.nioendpoint $ socketprocessor.dorun (Nioendpoint.java:1459) 2018-03-26 17: 01: 19.131 Erreur 9136 --- [Nio-8080-Exec-2] ChdController.Abasexecthandler: org.apache.tomcat.util.net.socketprocessorbase.run (socketprocessorbase.java:49) 2018-03-26 17: 01: 19.131 Erreur 9136 --- [NIO-8080-EXEC-2] ChdController.Basexception Gandand: java.util.concurrent.threadpoolexecutor.runworker (ThreadpoolExecutor.java:1142) 2018-03-26 17: 01: 19.131 Erreur 9136 --- [Nio-8080-EXEC-2] ChdController.BaseexceptionHandler: java.util.concurrent.threadpoolExecutor $ worker.run (ThreadpoolExecutor.java:617) 2018-03-26 17: 01: 19.131 Erreur 9136 --- [Nio-8080-EXEC-2] ChdController.BaseexceptionHandler: org.apache.tomcat.util.threads.taskthread $ wappingrunnable.run (taskthread.java:61) 2018-03-26 17: 01: 19.131 Erreur 9136 --- [NIO-8080-EXEC-2] ChdController.BaseexceptionHandler: java.lang.thread.run (thread.java:745) 2018-03-26 17: 01: 19.133 Warn 9136 --- [Nio-8080-Exec-2] .MmaExceptionHandlerexceptionResolver
Résumer
Ce qui précède est le résumé de gestion des erreurs de Springboot introduit par l'éditeur. J'espère que ce sera utile à tout le monde. Si vous avez des questions, veuillez me laisser un message et l'éditeur répondra à tout le monde à temps. Merci beaucoup pour votre soutien au site Web Wulin.com!