В процессе веб -разработки Java неизбежно будут некоторые исключения для системы или искусственные исключения. Как справиться с этим элегантно в спокойном проекте Springboot?
Анализ: В проекте Springboot в стиле Retful возвращаемые объекты тела являются все объекты тела, поэтому более уместно определить базовый класс результатов, который содержит состояние, сообщение, данные (возврат результата метода запроса).
Это будет более хлопотно, если вы определите несколько классов исключений для обработки. Например, StudentNotexistSexception и StudentExistSexception. Полем Полем и т. д., а код ошибки не может быть указан, что неудобно для передней части для обработки в соответствии с кодом ошибки.
Примечание. Поток обработки модели General Spring MVC выглядит следующим образом
Общий уровень контроллера-> Служба слоя-> слой DAO.
1. Уровень контроллера, принимайте запросы, выполняйте пейджинг и инкапсулирует объект DTO.
2. Служба уровня, логика выполнения, параллелизм управления и транзакции.
3. DAO -слой, взаимодействуйте с базой данных.
Используйте таблицу студентов, чтобы описать обработку:
1. Определите общую ошибку enum inductionExceptionEnum
public enum StudentExceptionEnum {Student_not_exist (1004, «Студент не существует, пожалуйста, подтвердите перед проверкой»), Student_exist (1005, «Студент уже существует»); частное целое число; частная строковая комментарий; StudentExceptionEnum (Integer Status, String Comment) {this.status = status; this.comment = комментарий; } public integer getStatus () {return Status; } public void setStatus (Integer Status) {this.status = status; } public String getComment () {return Comment; } public void setComment (строка Comment) {this.comment = comment; }}2 Определить основной результат обработки запрос класса
@Datapublic class requestoresult {private String message; частное целое число; данные частного объекта; public requestResult (строковое сообщение, целочисленное состояние, данные объекта) {this.message = сообщение; this.status = status; this.data = data; } public requestResult (String Message, Integer Status) {this.message = сообщение; this.status = status; } public requestResult (String Message, Integer Status) {this.message = сообщение; this.status = status; } public requestResult (String Message, StudentExceptionEnum requestExceptionEnum) {this.message = сообщение; this.status = requestexceptionenum.getstatus (); } public requestResult () {status = 200; Сообщение = "OK"; } public static requestResult ok (data Object) {requestResult result = new RequestResult (); result.setData (data); результат возврата; } public Static RequestResult Exception (строковое сообщение, целочисленное состояние) {return new RequestResult (сообщение, статус); } public static equestResult Exception (String Message, StudentExceptionEnum requestExceptionEnum) {return new RequestResult (Message, requestExceptionEnum); }}3 студента субъекта
@Datapublic Class Student реализует Serializable {Private String Id; Приватный прозвище; Приватное название строки; частный int возраст; частный строковый секс; частный строковый адрес; @Override public String toString () {return toStringBuilder.ReflectionToString (this); }}4 Обработайте запрос, добавьте студента, требуется прозвище. Здесь отображаются только коды фрагментов обслуживания
@Override public requestResult addStudent (студент) {if (studentDao.queryidbynickname (student.getnickname ()) == null) {studentDao.addStudent (студент); System.out.println («Добавить успешно»); Студент = StudentDao.QueryBynickName (student.getnickName ()); return requestResult.ok (студент); } else {return requestResult.exception ("user" + studive.getnickname () + "уже существует", StudentExceptionEnum.student_exist); }}5 В настоящее время базовая ситуация обработки была завершена. Базовый тест выполняется ниже
5.1 Добавить новую информацию одноклассника
5.2 Добавить еще раз, чтобы сделать его ненормальным тестом
2. На данный момент это в основном сделано, но будет недружелюбно вернуть его непосредственно на передний тренд, не обрабатывая основное исключение времени выполнения. Поэтому вам необходимо определить глобальный класс обработки исключений Runtimeexception.
Ключевая аннотация, которую нужно использовать здесь: @ExceptionHandler
Есть два использования 1) Добавить @exceptionHandler к контроллеру, который обрабатывает запрос. В настоящее время этот метод будет обрабатывать только исключение, брошенное контроллером.
2) Используйте его в глобальном классе обработки исключений. Глобальный класс обработки исключений должен быть помечен @RestControllerAdvice или @ControllerAdvice
Нам нужно обрабатывать глобальное Runtimeexception, поэтому мы используем второй метод. Конечно, это обрабатывается для удобства для клиентов. Нам все еще приходится иметь дело с этой ошибкой. Что мы должны делать? Необходимо записать неправильную информацию для будущего анализа и обработки. Регистрация выполняется здесь с использованием logger. Код выглядит следующим образом
@RestControllerAdvicePublic Class BaseExceptionHandler {private Static Logger = loggerFactory.getLogger (baseexceptionHandler.class); @ExceptionHandler (value = runtimeexception.class) public requestResult exceptionHandler (httpservletrequest, Exception e) {logerror (запрос, e); return requestResult.exception («Исключение обрабатывается внутри, инженер работает над аварийным ремонтом, вернитесь позже ...», 500); } public static void LogError (httpservletRequest запрос, Exception e) {logger.error ("Адрес запроса:" + request.getRequesturl ()); logger.error ("Метод запроса:" + request.getMethod ()); logger.error ("запрос ip:" + getRemoteip (запрос)); logger.error ("Детали ошибки:"); StackTraceElement [] error = e.getStackTrace (); для (StackTraceElement StackTraceElement: error) {logger.error (stackTraceElement.toString ()); }} public Static String getRemoteip (httpservletrequest) {string ip = request.getheader ("x-forwarded-for"); if (ip == null || ip.length () == 0 || "Неизвестно" .EqualSignoreCase (ip)) {ip = request.getheader ("proxy-client-ip"); } if (ip == null || ip.length () == 0 || "Неизвестно" .EqualSignoreCase (ip)) {ip = request.getheader ("wl-proxy-client-ip"); } if (ip == null || ip.length () == 0 || "Неизвестно" .EqualSignoreCase (ip)) {ip = request.getheader ("http_client_ip"); } if (ip == null || ip.length () == 0 || "Неизвестно" .EqualsIgnoreCase (ip)) {ip = request.getheader ("http_x_forwarded_for"); } if (ip == null || ip.length () == 0 || "Неизвестно" .EqualSignoreCase (ip)) {ip = request.getRemoteAddr (); }} else if (ip.length ()> 15) {string [] ips = ip.split (","); for (int index = 0; index <ips.length; index ++) {String strip = (String) ips [index]; if (! ("Неизвестно". EqualsIgnoreCase (Strip))) {ip = strip; перерыв; }}} return ip; }}Проверьте, чтобы увидеть, вступит ли в себя в силу:
Изменить и добавить информационный код студента следующим образом:
public requestResult addStudent (студент) {int a = 1/0; if (StudentDao.QueryIdbynickName (student.getnickName ()) == null) {studentDao.addStudent (студент); System.out.println («Добавить успешно»); Студент = StudentDao.QueryBynickName (student.getnickName ()); return requestResult.ok (студент); } else {return requestResult.exception ("user '" + study.getnickname () + "' уже существует", StudentExceptionEnum.student_exist); }}Выполнить тест
Сообщение об ошибке печати на фоне
2018-03-26 17: 01: 19.125 Ошибка 9136 --- [NIO-8080-EXEC-2] CHDCONTROLLER.BASEEXCEPTIONHANDLER: Адрес запроса: http: // localhost: 8080/demo1/student2018-03-26 17: 01: 19.125. 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: Информация об ошибке: 2018-03-26 17: 01: 19.125 Ошибка 9136 --- [NIO-8080-EXEC-2] CHDCONTROLLER.BASEEXCECTERHANDLER :- com.huitong.demo.service.studentservice.addStudent (Studentervice.java:71) 2018-03-26 17: 01: 19.125 Ошибка 9136 --- [NIO-8080-EXEC-2] ChdController.BaseExceptionHandler: com.huitong.demo.controller.studentController.addStudent (StudentController.java:38) 2018-03-26 17: 01: 19.125 ошибка 9136 --- [Nio-8080-exec-2] CHDController.Basexexception: sun.reflect.nativemple.natevimethler. Метод) 2018-03-26 17: 01: 19.125 Ошибка 9136 --- [NIO-8080-EXEC-2] CHDCONTROLLER.BASEEXCEPTIONHANDLER: SUN.REFLECT.NATIVEMETHODACCSORSORIMPL.INVOKE (NATIVEMETHODACCOSSORIMPL.JAVA [NIO-8080-EXEC-2] CHDCONTROLLER.BASEEXCEPTIONHANDLER: SUN.REFLECT.DELEGATIONMETHODACCSORSORIMPL.INVOKE (делегированиеметодаксошессоер. chdcontroller.baseexceptionHandler: java.lang.reflect.method.invoke (метод. Java:498) 2018-03-26 17: 01: 19.125 Ошибка 9136 --- [NIO-8080-EXEC-2] CHDCONTROLLER.BASEEXCECTION :- org.springframework.web.method.support.invocablehandlermethod.doinvoke (Envociatehandhandlermethod.java:209) 2018-03-26 17: 01: 19.125 Ошибка 9136 --- [Nio-8080-Exec-2] Chdcontroler.basececeptionhandler: org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:136)2018-03-26 17:01:19.125 ERROR 9136 --- [nio-8080-exec-2] chdcontroller.BaseExceptionHandler: org.springframework.web.servlet.mvc.method.annotation.servletinvocablehandlermethod.invokeandhandle (ServletinvocableHandlerMethod.java:102) 2018-03-26 17: 01: 19.125 Ошибка 9136 --- [Nio-8080-EXEC-2]. chdcontroller.baseexceptionHandler: org.springframework.web.servlet.mvc.method.annotation.requestmappingHandlerAdapter.invokehandlermethod (requestMappingHandlerAdapter.java:870) 2018-03-26 17: 01: 19.125. chdcontroller.baseexceptionHandler: org.springframework.web.servlet.mvc.method.annotation.requestmappingHandlerAdapter.handleinternal (requestMappingHandlerDapter.java:776) 2018-03-26 17: 01: 19.125 Ошибка 9136-[Nio-ex-ex-ex-ex-ex-ex-ex. chdcontroller.baseexceptionhandler: org.springframework.web.servlet.mvc.method.abstracthandlermethodapter.handle (Abstracthandlermethodadapter.java:87) 2018-03-26 17: 01: 19.129 ошибка 9136 --- [Nio- 808080808080808080-26: 01: 19.129 9136 --- chdcontroller.baseexceptionhandler: org.springframework.web.servlet.dispatcherservlet.dodispatch (Dispatcherservlet.java:991) 2018-03-26 17: 01: 19.129 Ошибка 9136 --- [Nio-8080-Execec-2] Chdcontroller.baseexceptionhandhandhandhandhandhandhandhasthryhandhandhaxhexhaxhexhaxhexhamphexh org.springframework.web.servlet.dispatcherservlet.doservice (DispatcherServlet.java:925) 2018-03-26 17: 01: 19.129 Ошибка 9136 --- [NIO-8080-EXEC-2] CHDCONTROLLER.BASEEXCECTION :- org.springframework.web.servlet.frameworkservlet.processrequest (Frameworkservlet.java:978) 2018-03-26 17: 01: 19.129 Ошибка 9136 --- [NIO-8080-EXEC-2] CHDCONTROLER.BASEEXCECTION :- org.springframework.web.servlet.frameworkservlet.dopost (Frameworkservlet.java:881) 2018-03-26 17: 01: 19.129 Ошибка 9136 --- [NIO-8080-EXEC-2] CHDCONTROLLER.BASEEXCECTION :- javax.servlet.http.httpservlet.service (httpservlet.java:661) 2018-03-26 17: 01: 19.129 Ошибка 9136 --- [NIO-8080-EXEC-2] CHDCONTROLLER.BASEEXCECTION :- org.springframework.web.servlet.frameworkservlet.service (Frameworkservlet.java:855) 2018-03-26 17: 01: 19.130 Ошибка 9136 --- [NIO-8080-EXEC-2] CHDController.BaseExceptionHandler: javax.servlet.http.httpservlet.service (httpservlet.java:742) 2018-03-26 17: 01: 19.130 Ошибка 9136 --- [NIO-8080-EXEC-2] CHDCONTROLLER.BASEEXCECTION :- org.apache.catalina.core.applicationFilterChain.InternaldOfilter (ApplicationFilterChain.Java:231) 2018-03-26 17: 01: 19.130 Ошибка 9136 --- [NIO-8080-EXEC-2] CHDCONTROLLER.BasexceptionHoundler: org.apache.catalina.core.applicationfilterchain.dofilter (ApplicationFilterChain.Java:166) 2018-03-26 17: 01: 19.130 Ошибка 9136 --- [NIO-8080-EXEC-2] CHDCONTROLLER.BASEEXCECTION :- org.apache.tomcat.websocket.server.wsfilter.dofilter (wsfilter.java:52) 2018-03-26 17: 01: 19.130 Ошибка 9136 --- [NIO-8080-EXEC-2] CHDCONTROLLER.BASEEXCECTION :- org.apache.catalina.core.applicationFilterChain.InternaldOfilter (ApplicationFilterChain.Java:193) 2018-03-26 17: 01: 19.130 Ошибка 9136 --- [NIO-8080-EXEC-2] CHDCONTROLLER.BasexceptionHoundler :- org.apache.catalina.core.applicationfilterchain.dofilter (ApplicationFilterChain.Java:166) 2018-03-26 17: 01: 19.130 Ошибка 9136 --- [NIO-8080-EXEC-2] CHDCONTROLLER.BASEEXCECTION :- com.alibaba.druid.support.http.webstatfilter.dofilter (webstatfilter.java:123) 2018-03-26 17: 01: 19.130 Ошибка 9136 --- [Nio-8080-Exec-2] CHDCONTROLLER.BasexceptionHandler :- org.apache.catalina.core.applicationFilterChain.InternaldOfilter (ApplicationFilterChain.Java:193) 2018-03-26 17: 01: 19.130 Ошибка 9136 --- [NIO-8080-EXEC-2] CHDCONTROLLER.BasexceptionHoundler :- org.apache.catalina.core.applicationfilterchain.dofilter (ApplicationFilterChain.Java:166) 2018-03-26 17: 01: 19.130 Ошибка 9136 --- [NIO-8080-EXEC-2] CHDCONTROLLER.BASEEXCECTION :- org.springframework.web.filter.requestcontextfilter.dofilterinternal (requestontextfilter.java:99) 2018-03-26 17: 01: 19.130 Ошибка 9136 --- [NIO-8080-EXEC-2] CHDCONTROLLER.BasexexceptionHandler :- :- org.springframework.web.filter.onceperquestfilter.dofilter (oneperrequestfilter.java:107) 2018-03-26 17: 01: 19.130 Ошибка 9136 --- [Nio-8080-Exec-2] CHDCONTROLLER.BasexceptionHandler :- :- org.apache.catalina.core.applicationFilterChain.InternaldOfilter (ApplicationFilterChain.Java:193) 2018-03-26 17: 01: 19.130 Ошибка 9136 --- [NIO-8080-EXEC-2] CHDCONTROLLER.BasexceptionHoundler :- org.apache.catalina.core.applicationfilterchain.dofilter (ApplicationFilterChain.Java:166) 2018-03-26 17: 01: 19.130 Ошибка 9136 --- [NIO-8080-EXEC-2] CHDCONTROLLER.BASEEXCECTION :- org.springframework.web.filter.httpputformcontentfilter.dofilterinternal (httpputformcontentfilter.java:109) 2018-03-26 17: 01: 19.130 Ошибка 9136 --- [Nio-8080-Execec-2] CHDCONTROLRER.BasexCeppeceHand :- [NIO-8080-EXEC-2] CHDCONTROLLER.BASEREXARDHARDHARDHARDHand :- [NIO-8080-EXECEC-2]. org.springframework.web.filter.onceperquestfilter.dofilter (oneperrequestfilter.java:107) 2018-03-26 17: 01: 19.130 Ошибка 9136 --- [Nio-8080-Exec-2] CHDCONTROLLER.BasexceptionHandler :- :- org.apache.catalina.core.applicationFilterChain.InternaldOfilter (ApplicationFilterChain.Java:193) 2018-03-26 17: 01: 19.131 Ошибка 9136 --- [NIO-8080-EXEC-2] CHDCONTROLER.BasexceptionHandler: org.apache.catalina.core.applicationfilterchain.dofilter (ApplicationFilterChain.Java:166) 2018-03-26 17: 01: 19.131 Ошибка 9136 --- [NIO-8080-EXEC-2] CHDCONTROLLER.BASEEXCECTION :- org.springframework.web.filter.hiddenhttpmethodfilter.dofilterinternal (hiddenhttpmethodfilter.java:81) 2018-03-26 17: 01: 19.131 Ошибка 9136-[nio-8080-Execec-2] Chdconstroller.blexhexhexeHDHAND.LEREX-Handhroll org.springframework.web.filter.onceperquestfilter.dofilter (oneperrequestfilter.java:107) 2018-03-26 17: 01: 19.131 ошибка 9136 --- [Nio-8080-Exec-2] CHDController.BasexceptionHandler :- :- org.apache.catalina.core.applicationFilterChain.InternaldOfilter (ApplicationFilterChain.Java:193) 2018-03-26 17: 01: 19.131 Ошибка 9136 --- [NIO-8080-EXEC-2] CHDCONTROLER.BasexceptionHandler: org.apache.catalina.core.applicationfilterchain.dofilter (ApplicationFilterChain.Java:166) 2018-03-26 17: 01: 19.131 Ошибка 9136 --- [NIO-8080-EXEC-2] CHDCONTROLLER.BASEEXCECTION :- org.springframework.web.filter.characterencodingfilter.dofilterinternal (Harmentencodingfilter.java:200) 2018-03-26 17: 01: 19.131 ошибка 9136 --- [Nio-8080-Exec-2] chdcontroller.basexception :-. org.springframework.web.filter.onceperquestfilter.dofilter (oneperrequestfilter.java:107) 2018-03-26 17: 01: 19.131 ошибка 9136 --- [Nio-8080-Exec-2] CHDController.BasexceptionHandler :- :- org.apache.catalina.core.applicationFilterChain.InternaldOfilter (ApplicationFilterChain.Java:193) 2018-03-26 17: 01: 19.131 Ошибка 9136 --- [NIO-8080-EXEC-2] CHDCONTROLER.BasexceptionHandler: org.apache.catalina.core.applicationfilterchain.dofilter (ApplicationFilterChain.Java:166) 2018-03-26 17: 01: 19.131 Ошибка 9136 --- [NIO-8080-EXEC-2] CHDCONTROLLER.BASEEXCECTION :- org.apache.catalina.core.standardwrappervalve.invoke (StandardWrappervalve.java:199) 2018-03-26 17: 01: 19.131 Ошибка 9136 --- [NIO-8080-EXEC-2] CHDCONTROLLER.BASEEXCECTION :- org.apache.catalina.core.standardcontextvalve.invoke (StandardContextValve.java:96) 2018-03-26 17: 01: 19.131 Ошибка 9136 --- [NIO-8080-EXEC-2] CHDCONTROLLER.BASEEXCECTION :- [NIO-8080-EXEC-2] CHDCONTROLLER.BASEEXCECTION :- org.apache.catalina.authenticator.authenticatorbase.invoke (AuthenticatorBase.java:496) 2018-03-26 17: 01: 19.131 Ошибка 9136 --- [NIO-8080-EXEC-2] CHDCONTROLLER.BASEEXCECTION :- org.apache.catalina.core.standardhostvalve.invoke (Standardhostvalve.java:140) 2018-03-26 17: 01: 19.131 Ошибка 9136 --- [NIO-8080-EXEC-2] CHDCONTROLLER.BASEEXCECTION :- org.apache.catalina.valves.errorreportvalve.invoke (errorReportValve.java:81) 2018-03-26 17: 01: 19.131 Ошибка 9136 --- [NIO-8080-EXEC-2] CHDCONTROLLER.BASEEXCECTION :- [NIO-8080-EXEC-2] CHDCONTROLLER.BASEEXCECTION :- org.apache.catalina.core.standardenginevalve.invoke (standarenginevalve.java:87) 2018-03-26 17: 01: 19.131 ошибка 9136 --- [Nio-8080-Exec-2] ChdController.BasexCeptionHandler: org.apache.catalina.connector.coyoteadapter.service (coyoteadapter.java:342) 2018-03-26 17: 01: 19.131 Ошибка 9136 --- [NIO-8080-EXEC-2] ChdController.BasexCeptionHandler: org.apache.coyote.http11.http11processor.service (http11processor.java:803) 2018-03-26 17: 01: 19.131 Ошибка 9136 --- [NIO-8080-EXEC-2] CHDCONTROLLER.BasexceptionHandler: org.apache.coyote.abstractprocessorlight.process (AbstractProcessorlight.java:66) 2018-03-26 17: 01: 19.131 Ошибка 9136 --- [NIO-8080-EXEC-2] ChdController.BasexceptionHandler: org.apache.coyote.abstractprotocol $ connectionhandler.process (AbstractProtocol.java:790) 2018-03-26 17: 01: 19.131 Ошибка 9136 --- [NIO-8080-EXEC-2] CHDCONTROLLER.BASEXECEPTION :- org.apache.tomcat.util.net.nioendpoint $ socketprocessor.dorun (nioendpoint.java:1459) 2018-03-26 17: 01: 19.131 Ошибка 9136 --- [Nio-8080-Exec-2] CHDCONTROLLER.BasexceptionHandler :- :- org.apache.tomcat.util.net.socketProcessessorBase.run (SocketProcessorBase.java:49) 2018-03-26 17: 01: 19.131 Ошибка 9136 --- [NIO-8080-EXEC-2] CHDCONTROLLER.BASEEXCECTION :- java.util.concurrent.threadpoolexecutor.runworker (ThreadPoolexeCutor.Java:1142) 2018-03-26 17: 01: 19.131 Ошибка 9136 --- [NIO-8080-EXEC-2] CHDCONTROLLER.BasexexceptionHACTION :- java.util.concurrent.threadpoolexecutor $ worker.run (threadpoolexecutor.java:617) 2018-03-26 17: 01: 19.131 ошибка 9136 --- [Nio-8080-Exec-2] CHDControler.BasexexceptionHandler: org.apache.tomcat.util.threads.taskthread $ wrappingrunnable.run (taskthread.java:61) 2018-03-26 17: 01: 19.131 ошибка 9136 --- [Nio-8080-Exec-2] CHDController.BasexCectionHandler :- java.lang.thread.run (Thread.java:745) 2018-03-26 17: 01: 19.133 Warn 9136 --- [NIO-8080-EXEC-2] .mmaExceptionHandLerexceptionResolver: Resessure Exception, вызванное исполнением обработки: Java.lang.arithmetexception: by Zero.
Суммировать
Выше приведено резюме обработки ошибок Springboot, представленное редактором. Я надеюсь, что это будет полезно для всех. Если у вас есть какие -либо вопросы, пожалуйста, оставьте мне сообщение, и редактор ответит всем вовремя. Большое спасибо за вашу поддержку сайту wulin.com!