Während des Java -Webentwicklungsprozesses wird es zwangsläufig einige Systemausnahmen oder künstliche Ausnahmen geben. Wie gehe ich in einem erholsamen Springboot -Projekt elegant damit um?
Analyse: Im Frontful-Stil-Springboot-Projekt sind die zurückgegebenen Körperobjekte alle Körperobjekte. Daher ist es angemessener, eine Ergebnisbasisklasse zu definieren, die Status, Nachricht und Daten enthält (Rückgabeergebnis der Anforderungsmethode).
Es wird schwieriger sein, wenn Sie mehrere Ausnahmeklassen für die Verarbeitung definieren. Beispielsweise existieren StudentNotexistsexception und studentsexception. . . usw., und der Fehlercode kann nicht angegeben werden, was für das Front-End entsprechend dem Fehlercode unpraktisch ist.
Hinweis: Der allgemeine Feder -MVC -Modellverarbeitungsfluss ist wie folgt
Allgemeine Controller Layer-> Service Layer-> DAO-Schicht.
1. Controller -Schicht, Anfragen annehmen, Paging durchführen und ein DTO -Objekt einkapseln.
2. Serviceschicht, Ausführungslogik, Steuersatz und Transaktionen.
3.Dao -Schicht, interagieren Sie mit der Datenbank.
Verwenden Sie eine Schülertabelle, um die Verarbeitung zu beschreiben:
1. Definieren Sie den gemeinsamen Fehler Enum studentExceptionEnum
public enum studentExceptionEnum {student_not_exist (1004, "Student existiert nicht, bitte bestätigen Sie vor dem Überprüfen"), Student_EXIST (1005, "Schüler existiert bereits"); privater Ganzzahlstatus; privater String -Kommentar; StudentExceptionEnum (Ganzzahlstatus, String -Kommentar) {this.status = Status; this.comment = comment; } public Integer getStatus () {Rückgabestatus; } public void setStatus (Ganzzahlstatus) {this.status = Status; } public String getCompment () {return comment; } public void setCompment (String -Kommentar) {this.comment = comment; }}2 Definieren Sie eine grundlegende Verarbeitungsergebnisklasse RequestResult
@Datapublic Class RequestResult {private String -Nachricht; privater Ganzzahlstatus; private Objektdaten; public requestResult (String -Nachricht, Ganzzahlstatus, Objektdaten) {this.message = message; this.status = Status; this.data = Daten; } public RequestResult (String -Nachricht, Integer Status) {this.message = message; this.status = Status; } public RequestResult (String -Nachricht, Integer Status) {this.message = message; this.status = Status; } public requestResult (String -Nachricht, studentExceptionEnum RequestExceptionEnum) {this.message = message; this.status = RequestExceptionEnum.getStatus (); } public requestResult () {status = 200; Message = "OK"; } public static RequestResult OK (Objektdaten) {RequestResult result = new RequestResult (); result.setData (Daten); Rückgabeergebnis; } public static RequestResult -Ausnahme (String -Nachricht, Integer Status) {Neue RequestResult (Nachricht, Status); } public static RequestResult -Ausnahme (String -Nachricht, studentExceptionEnum RequestExceptionEnum) {Neue RequestResult (Message, RequestExceptionEnum); }}3 Entitätsstudent
@Datapublic Class Student implementiert serialisierbare {private String -ID; privater String -Spitzname; privater Zeichenfolge Name; privates int Alter; privater String Sex; private String -Adresse; @Override public String toString () {return toStringBuilder.reflectionToString (this); }}4 Verarbeiten Sie die Anfrage und fügen Sie den Schüler hinzu, Spitzname erforderlich. Hier werden nur Service -Snippet -Codes angezeigt
@Override public requestResult addStudent (Student) {if (studentdao.queryIdbynickname (student.getNickname ()) == null) {studentdao.addstudent (student); System.out.println ("erfolgreich hinzufügen"); student = studentdao.querybynickname (Student.getNickName ()); return requestResult.ok (Student); } else {return requestResult.Exception ("user" + student.getNickname () + "bereits existieren", studentExceptionEnum.student_exist); }}5 Zu diesem Zeitpunkt wurde die grundlegende Verarbeitungssituation abgeschlossen. Der grundlegende Test wird unten durchgeführt
5.1 Fügen Sie eine neue Klassenkameradinformation hinzu
5.2 erneut hinzufügen, um es abnormal zu testen
2. Zu diesem Zeitpunkt ist es im Grunde genommen fertig, aber es wird unfreundlich sein, es direkt zum Front-End zurückzugeben, ohne die grundlegende Laufzeitausnahme zu bewältigen. Daher müssen Sie eine globale Ausnahmeklasse für die RunTimeException -Ausnahme definieren.
Die wichtigste Annotation, die hier verwendet werden muss: @ExceptionHandler
Es gibt zwei Verwendungen 1) @ExceptionHandler zu dem Controller hinzufügen, der die Anfrage abwickelt. Zu diesem Zeitpunkt wird diese Methode nur die vom Controller ausgelöste Ausnahme behandeln.
2) Verwenden Sie es in der globalen Ausnahmebehandlung. Die globale Ausnahmeregelung muss mit @restControllerAdvice oder @ControllerAdvice gekennzeichnet sein
Wir müssen die globale RunTimeException -Annahme bewältigen, daher verwenden wir die zweite Methode. Dies wird natürlich für kundenfreundliche behandelt. Wir müssen uns noch mit diesem Fehler befassen. Was sollen wir tun? Es ist notwendig, die falschen Informationen für die zukünftige Analyse und Verarbeitung aufzuzeichnen. Die Protokollierung wird hier mit Logger durchgeführt. Der Code ist wie folgt
@RestControllerAdvicePublic Class BaseexceptionHandler {private static Logger logger = loggerfactory.getLogger (BaseexceptionHandler.class); @ExceptionHandler (value = runTimeException.class) public RequestResult ExceptionHandler (httpServletRequest -Anfrage, Ausnahme e) {loggerror (request, e); return requestResult.exception ("Ausnahme wird intern behandelt, der Ingenieur arbeitet an Notfallreparaturen, bitte kommen Sie später zurück ...", 500); } public static void leichterror (httpServletRequest -Anforderung, Ausnahme e) {logger.Error ("Anfrage Adresse:" + request.getRequesturl ()); logger.Error ("Anforderungsmethode:" + request.getMethod ()); logger.Error ("Anfrage IP:" + getRemoteip (Anfrage)); Logger.Error ("Fehlerdetails:"); StackTraceElement [] error = e.getStacktrace (); für (stacktraceElement stacktraceElement: error) {logger.Error (stacktraceElement.toString ()); }} public static String getRemoteip (httpServletRequest-Anforderung) {String ip = request.getheader ("x-forward-for"); if (ip == null || ip.length () == 0 || "unbekannt" .EqualSignoreCase (ip)) {ip = request.getheader ("proxy-client-ip"); } if (ip == null || ip.length () == 0 || "unbekannt" .EqualSignoreCase (ip)) {ip = request.getheader ("wl-proxy-client-ip"); } if (ip == null || ip.length () == 0 || "unbekannt" .EqualSignoreCase (ip)) {ip = request.getheader ("http_client_ip"); } if (ip == null || ip.length () == 0 || "unbekannt" .EqualSignoreCase (ip)) {ip = request.getheader ("http_x_forwarded_for"); } if (ip == null || ip.length () == 0 || "unbekannt" .EqualSignoreCase (ip)) {ip = request.getRemoteaddr (); }} else if (ip.length ()> 15) {string [] ips = ip.split (","); für (int index = 0; index <ips.length; index ++) {String strip = (String) iPS [index]; if (! ("unbekannt" .EqualSignoreCase (Strip))) {ip = strip; brechen; }}} return ip; }}Test, um festzustellen, ob es wirksam wird:
Ändern und fügen Sie den Informationscode des Schülers wie folgt hinzu:
public requestResult addStudent (Student) {int a = 1/0; if (studentdao.queryIdbynickname (student.getNickName ()) == null) {studentDao.addstudent (student); System.out.println ("erfolgreich hinzufügen"); student = studentdao.querybynickname (Student.getNickName ()); return requestResult.ok (Student); } else {return requestResult.Exception ("user '" + student.getNickname () + "' bereits existiert", studentExceptionEnum.student_exist); }}Einen Test durchführen
Druckfehlermeldung im Hintergrund
2018-03-26 17: 01: 19.125 Fehler 9136 --- [NIO-8080-EXEC-2] CHDCONTROLLER.BaseExceptionHandler: Anfrage Adresse: http: // localhost: 8080/Demo1/Student2018-03-26 17: 01: 19.125 Fehler 9136-[Nio-808080-8080-8080-8080-8080-80-80-80-80-80-80-80-80-80-80-80-80-80-80-80-80-80-80-80-80-80-80-80-80-80-80-80-80-80-80-80-80-80-80-80-80-80-80-80-80-80-25 chdcontroller.BaseExceptionHandler : Request method: POST2018-03-26 17:01:19.125 ERROR 9136 --- [nio-8080-exec-2] chdcontroller.BaseExceptionHandler : Request IP: 0:0:0:0:0:0:0:0:0:0:0:12018-03-26 17:01:19.125 ERROR 9136 --- [NIO-8080-EXEC-2] CHDCONTROLLER.BaseexceptionHandler: Fehlerdetails: 2018-03-26 17: 01: 19.125 Fehler 9136 --- [NIO-8080-EXEC-2] CHDCONTROLLER.BASEEXCTEMETLER: com.huitong.demo.service.studentService.addstudent (studentservice.java:71) 2018-03-26 17: 01: 19.125 Fehler 9136 --- [NIO-8080-EXEC-2] chdController.basexceptionHandler: com.huitong.demo.controller.studentcontroller.addstudent (studentController.java:38) 2018-03-26 17: 01: 19.125 ERROR 9136 --- [nio-8080-exec-2] chdcontroller.basexceptionhandler: sun.reflect.refrect.Nefect.Nefect.Nefect. Methode) 2018-03-26 17: 01: 19.125 Fehler 9136 --- [NIO-8080-EXEC-2] CHDCONTROLLER.BaseExceptionHandler: sun.reflect.nativemethodaccessorimpl.invoke (Nativemethodaccessorimpl.java:62) 2018-03-26 17: 0125: 012525) 2018-03-26 17: 0125: 0122525) 2018-03-26 17: 01-25: 0125: 012525) --- [NIO-8080-EXEC-2] CHDCONTROLLER.BaseExceptionHandler: sun.reflect.delegatingMethoccessorImpl.invoke (DelegatingMethodaccessorimpl.java:43) 2018-03-26 17: 01: 19.125 Fehler 9136 --- [NIO-8080-80-EXEC-2] chdcontroller.baseexceptionHandler: java.lang.reflect.method.invoke (method.java:498) 2018-03-26 17: 01: 19.125 ERROR 9136 --- [NIO-8080-EXEC-2] CHDCONTROLLER.BASEEXCTERATIONHELTER: org.springframework.web.method.support.invocableHandlermethod.doInvoke (invocableHandlermethod.java:209) 2018-03-26 17: 01: 19.125 Fehler 9136-[NIO-8080-EXEC-2] CHDCONTROLER.BASEXCTIONHELLER: org.springFramework.web.method.support.invocableHandlermethod.invokeForRequest (invocableHandlermethod.java:136) 2018-03-26 17: 01: 19.125 Fehler 9136-[NIO-8080-EXEC-2] CHDCONTROLLER.BASEEX ANGEBOT: org.springframework.web.servlet.mvc.method.annotation chdcontroller.BaseExceptionHandler: org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:870)2018-03-26 17:01:19.125 ERROR 9136 --- [NIO-8080-EXEC-2] CHDCONTROLLER.BASEXCECTIONHANDLER: org.springFramework.Web.Servlet.Mvc.Method.Annotation [nio-8080-exec-2] chdcontroller.BaseExceptionHandler: org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)2018-03-26 17:01:19.129 ERROR 9136 --- [NIO-8080-EXEC-2] CHDCONTROLLER.BasexceptionHandler: org.springFramework.web.Servlet.DispatcherServlet.Dodispatch (DispatcherServlet.Java:91) 2018-03-26 17: 01: 19.129 Fehler 9136--[ chdcontroller.baseexceptionHandler: org.springFramework.web.servlet.dispatcherServlet.doService (DispatcherServlet.Java:925) 2018-03-26 17: 01: 19.129 ERROR 9136-[NIO-8080-EXEC-2. org.springframework.web.servlet.frameworkServlet.ProcessRequest (FrameworkServlet.java:978) 2018-03-26 17: 01: 19.129 Fehler 9136 --- [NIO-8080-EXEC-2] CHDCONTROLER.BASEXCTIONSCHAFTER: org.springframework.web.servlet.frameworkServlet.dopost (FrameworkServlet.java:881) 2018-03-26 17: 01: 19.129 ERROR 9136 --- [NIO-8080-EXEC-2] CHDCONTROLLER.BASEEXCTERATIONHANDLER: javax.servlet.http.httpServlet.Service (httpServlet.java:661) 2018-03-26 17: 01: 19.129 Fehler 9136 --- [NIO-8080-EXEC-2] chd-controller.baseexceptionHandler: org.springframework.web.servlet.frameworkServlet.Service (FrameworkServlet.java:855) 2018-03-26 17: 01: 19.130 Fehler 9136 --- [NIO-8080-EXEC-2] chdcontroller.basexceptionhandler: javax.servlet.http.httpServlet.Service (httpServlet.java:742) 2018-03-26 17: 01: 19.130 Fehler 9136 --- [NIO-8080-EXEC-2] chdController.baseexceptionHandler: org.apache.catalina.core.applicationFilterchain.internaldofilter (ApplicationFilterchain.java:231) 2018-03-26 17: 01: 19.130 Fehler 9136 --- [NIO-8080-EXEC-2] CHDCONTROLER.BASEEXCTERATIONHELTER: org.apache.catalina.core.applicationFilterchain.dofilter (ApplicationFilterchain.java:166) 2018-03-26 17: 01: 19.130 Fehler 9136 --- [NIO-8080-EXEC-2] ChdController.Baseexceptionhandler: org.apache.tomcat.websocket.server.wsfilter.dofilter (wsfilter.java:52) 2018-03-26 17: 01: 19.130 ERROR 9136 --- [NIO-8080-EXEC-2] CHDCONTROLER.BASEEXCTERATELER: org.apache.catalina.core.applicationFilterchain.internaldofilter (ApplicationFilterchain.java:193) 2018-03-26 17: 01: 19.130 ERROR 9136 --- [NIO-8080-EXEC-2] CHDCONTROLER.BASEEXCTERATELER: org.apache.catalina.core.applicationFilterchain.dofilter (ApplicationFilterchain.java:166) 2018-03-26 17: 01: 19.130 Fehler 9136 --- [NIO-8080-EXEC-2] ChdController.Baseexceptionhandler: com.alibaba.druid.support.http.webstatfilter.dofilter (webstatfilter.java:123) 2018-03-26 17: 01: 19.130 Fehler 9136-[NIO-8080-EXEC-2] chdcontroller.basexceptionSattler. org.apache.catalina.core.applicationFilterchain.internaldofilter (ApplicationFilterchain.java:193) 2018-03-26 17: 01: 19.130 ERROR 9136 --- [NIO-8080-EXEC-2] CHDCONTROLER.BASEEXCTERATELER: org.apache.catalina.core.applicationFilterchain.dofilter (ApplicationFilterchain.java:166) 2018-03-26 17: 01: 19.130 Fehler 9136 --- [NIO-8080-EXEC-2] ChdController.Baseexceptionhandler: org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:99)2018-03-26 17:01:19.130 ERROR 9136 --- [nio-8080-exec-2] chdcontroller.BaseExceptionHandler: org.springframework.web.filter.onceperrequestFilter.dofilter (EinmalerRequestFilter.Java:107) 2018-03-26 17: 01: 19.130 Fehler 9136-[NIO-8080-EXEC-2] chdcontroller.basexceptionsChring: org.apache.catalina.core.applicationFilterchain.internaldofilter (ApplicationFilterchain.java:193) 2018-03-26 17: 01: 19.130 ERROR 9136 --- [NIO-8080-EXEC-2] CHDCONTROLER.BASEEXCTERATELER: org.apache.catalina.core.applicationFilterchain.dofilter (ApplicationFilterchain.java:166) 2018-03-26 17: 01: 19.130 Fehler 9136 --- [NIO-8080-EXEC-2] ChdController.Baseexceptionhandler: org.springFramework.web.filter.httpputformContentFilter.DofilterInternal (httpputformContentFilter.java:109) 2018-03-26 17: 01: 19.130 ERROR 9136-[NIO-8080-EXEC-2] CHDCONTROLLER.BASEEXCTERAULER: org.springframework.web.filter.onceperrequestFilter.dofilter (EinmalerRequestFilter.Java:107) 2018-03-26 17: 01: 19.130 Fehler 9136-[NIO-8080-EXEC-2] chdcontroller.basexceptionsChring: org.apache.catalina.core.applicationFilterchain.internaldofilter (ApplicationFilterchain.java:193) 2018-03-26 17: 01: 19.131 Fehler 9136 --- [NIO-8080-EXEC-2] CHDCONTROLER.BASEEXPENTIONHELTER: org.apache.catalina.core.applicationFilterchain.dofilter (ApplicationFilterchain.java:166) 2018-03-26 17: 01: 19.131 Fehler 9136 --- [NIO-8080-EXEC-2] CHDCONTROLLER.BASEEXCTERATIONHANDLER: org.springframework.web.filter.hiddenhttpMethodFilter.Dofilterinternal (HiddenhttpMethodFilter.java:81) 2018-03-26 17: 01: 19.131 Fehler 9136 --- [Nio-8080808080808080808080808080808080808080808080. org.springframework.web.filter.onceperrequestFilter.dofilter (EinmalerRequestFilter.java:107) 2018-03-26 17: 01: 19.131 Fehler 9136-[NIO-8080- Exec-2] chdcontroller.basexception.basexception. org.apache.catalina.core.applicationFilterchain.internaldofilter (ApplicationFilterchain.java:193) 2018-03-26 17: 01: 19.131 Fehler 9136 --- [NIO-8080-EXEC-2] CHDCONTROLER.BASEEXPENTIONHELTER: org.apache.catalina.core.applicationFilterchain.dofilter (ApplicationFilterchain.java:166) 2018-03-26 17: 01: 19.131 Fehler 9136 --- [NIO-8080-EXEC-2] CHDCONTROLLER.BASEEXCTERATIONHANDLER: org.springframework.web.filter.characacterencodingFilter.Dofilterinternal (CharakterCodingfilter.java:200) 2018-03-26 17: 01: 19.131 Fehler 9136-[NIO-8080-eec-2] chdcontroller.BaSeexceexceptler. org.springframework.web.filter.onceperrequestFilter.dofilter (EinmalerRequestFilter.java:107) 2018-03-26 17: 01: 19.131 Fehler 9136-[NIO-8080- Exec-2] chdcontroller.basexception.basexception. org.apache.catalina.core.applicationFilterchain.internaldofilter (ApplicationFilterchain.java:193) 2018-03-26 17: 01: 19.131 Fehler 9136 --- [NIO-8080-EXEC-2] CHDCONTROLER.BASEEXPENTIONHELTER: org.apache.catalina.core.applicationFilterchain.dofilter (ApplicationFilterchain.java:166) 2018-03-26 17: 01: 19.131 Fehler 9136 --- [NIO-8080-EXEC-2] CHDCONTROLLER.BASEEXCTERATIONHANDLER: org.apache.catalina.core.standardwrappervalve.invoke (Standardwrappervalve.java:199) 2018-03-26 17: 01: 19.131 Fehler 9136 --- [NIO-8080-EXEC-2] CHDCONTROLER.BASEEXCTERATELER: org.apache.catalina.core.standardcontextvalve.invoke (StandardContextValve.java:96) 2018-03-26 17: 01: 19.131 Fehler 9136 --- [NIO-8080-EXEC-2] CHDCONTROLLER.BASEEXCTERATELERSHANDLER: org.apache.catalina.authenticator.authenticatorbase.invoke (authenticatorbase.java:496) 2018-03-26 17: 01: 19.131 ERROR 9136 --- [NIO-8080-EXEC-2] CHDCONTROLER.BASEEXCTELERTERTER: org.apache.catalina.core.standardHostvalve.invoke (StandardHostvalve.java:140) 2018-03-26 17: 01: 19.131 Fehler 9136 --- [NIO-8080-EXEC-2] ChdController.baseexceptionhandler: org.apache.catalina.valves.ErorRePortValve.invoke (ErrorRorportvalve.java:81) 2018-03-26 17: 01: 19.131 Fehler 9136 --- [NIO-8080-EXEC-2] ChdController.baseexceptionhandler: org.apache.catalina.core.standardenginevalve.invoke (Standardginevalve.java:87) 2018-03-26 17: 01: 19.131 Fehler 9136 --- [NIO-8080-EXEC-2] ChdController.baseexceptionhandler: org.apache.catalina.connector.coyoteadapter.Service (Coyoteadapter.java:342) 2018-03-26 17: 01: 19.131 Fehler 9136 --- [NIO-8080-EXEC-2] chdController.baseexceptionhandler: org.apache.coyote.http11.http11Processor.service (http11Processor.java:803) 2018-03-26 17: 01: 19.131 Fehler 9136-[NIO-8080-EXEC-2] CHDCONTROLLER.BASEXCTIONSCHAFT. org.apache.coyote.abstractProcessorlight.Process (AbstractProcessorlight.java:66) 2018-03-26 17: 01: 19.131 Fehler 9136 --- [NIO-8080-EXEC-2] chdController.baseexceptionHandler: org.apache.coyote.abstractProtocol $ connectionHandler.Process (AbstractProtocol.java:790) 2018-03-26 17: 01: 19.131 Fehler 9136 --- [NIO-8080-EXEC-2] chdController.baseexceptionhandler: org.apache.tomcat.util.net.nioendpoint $ socketProcessor.dorun (nioendpoint.java:1459) 2018-03-26 17: 01: 19.131 Fehler 9136 --- [NIO-8080-EXEC-2] CHDCONTROLER.BASEEXTEDERSCHAFTER: org.apache.tomcat.util.net.socketprocessorbase.run (SocketProcessorbase.java:49) 2018-03-26 17: 01: 19.131 Fehler 9136 --- [NIO-8080-EXEC-2] CHDCONTROLER.BASEEXCTELERTERTER: java.util.concurrent.threadpoolexecutor.runworker (threadpoolexecutor.java:1142) 2018-03-26 17: 01: 19.131 ERROR 9136 --- [NIO-8080-EXEC-2] CHDCONTROLLER.BASEExceptionHandler: java.util.concurrent.threadpoolexecutor $ Worker.run (threadpoolexecutor.java:617) 2018-03-26 17: 01: 19.131 ERROR 9136 --- [NIO-8080-EXEC-2] ChdController.baseexceptionHandler: org.apache.tomcat.util.threads.taskthread $ Wrappingrunnable.run (Taskthread.java:61) 2018-03-26 17: 01: 19.131 Fehler 9136 --- [NIO-8080-EXEC-2] CHDCONTROLLER.BASEEXCTERATIONHANDLER: java.lang.thread.run (thread.java:745) 2018-03-26 17: 01: 19.133 Warn 9136 --- [NIO-8080-EXEC-2] .MMAExceptionHandRerexceptionResolver: Auflösende Ausnahme, die durch Handler-Ausführung verursacht wurde:
Zusammenfassen
Das obige ist die vom Editor eingeführte Springboot -Fehlerbearbeitung. Ich hoffe, es wird für alle hilfreich sein. Wenn Sie Fragen haben, hinterlassen Sie mir bitte eine Nachricht und der Editor wird allen rechtzeitig antworten. Vielen Dank für Ihre Unterstützung auf der Wulin.com -Website!