Two Methods for unified Exception Handling using Spring
1. Custom unified Exception processor custom Exception implementation HandlerExceptionResolver interface or inherit the AbstractHandlerExceptionResolver class
1. Implement HandlerExceptionResolver
Package com. jay. platform. exception. handler; import java. io. IOException; import java.net. connectException; import java.net. socketTimeoutException; import java. util. date; import javax. servlet. http. httpServletRequest; import javax. servlet. http. httpServletResponse; import org. apache. log4j. logger; import org. springframework. web. servlet. handlerExceptionResolver; import org. springframework. web. servlet. modelAndView; import com. jay. platform. exception. ajaxException; import com. jay. platform. exception. businessException;/***** @ ClassName: ExceptionHandler * @ Description: Unified Exception Handling. Note that the exception thrown by the Controller layer can be handled here, but do not handle exceptions captured by the Controller (Exceptions captured by the Controller are not processed here) * @ author Jay He * @ date 10:22:11 a.m. on April 9 */public class ExceptionHandler implements HandlerExceptionResolver {private static final Logger LOGGER = Logger. getLogger (ExceptionHandler. class); @ Override public ModelAndView resolveException (HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {LOGGER. error (new Date (). toLocaleString () + "exception information", ex); if (ex instanceof NumberFormatException) {return new ModelAndView ("exception/number");} else if (ex instanceof NullPointerException) {return new ModelAndView ("exception/null");} else if (ex instanceof BusinessException) {return new ModelAndView ("exception/business ");} else if (ex instanceof SocketTimeoutException | ex instanceof ConnectException) {try {response. getWriter (). write ("network exception");} catch (IOException e) {e. printStackTrace ();} return new ModelAndView ("exception/net_error");} else if (ex instanceof AjaxException) {System. out. println ("-=");} return new ModelAndView ("exception/exception ");}}
2. inherit the AbstractHandlerExceptionResolver class
Package com. jay. platform. exception. handler; import java. io. IOException; import java.net. connectException; import java.net. socketTimeoutException; import java. util. date; import javax. servlet. http. httpServletRequest; import javax. servlet. http. httpServletResponse; import org. apache. log4j. logger; import org. springframework. web. servlet. handlerExceptionResolver; import org. springframework. web. servlet. modelAndView; import org. springframework. web. servlet. handler. abstractHandlerExceptionResolver; import com. jay. platform. exception. ajaxException; import com. jay. platform. exception. businessException;/***** @ ClassName: ExceptionHandler * @ Description: Unified Exception Handling. Note that the exception thrown by the Controller layer can be handled here, but do not handle exceptions captured by the Controller (Exceptions captured by the Controller are not processed here) * @ author Jay He * @ date 10:22:11 on April 9, November 4, 2014 **/public class ExceptionHandler extends acthandlerexceptionresolver {private static final Logger LOGGER = Logger. getLogger (ExceptionHandler. class); @ Override protected ModelAndView doResolveException (HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex ){
LOGGER. error (new Date (). toLocaleString () + "exception information", ex); if (ex instanceof NumberFormatException) {return new ModelAndView ("exception/number");} else if (ex instanceof NullPointerException) {return new ModelAndView ("exception/null");} else if (ex instanceof BusinessException) {return new ModelAndView ("exception/business ");} else if (ex instanceof SocketTimeoutException | ex instanceof ConnectException) {try {response. getWriter (). write ("network exception");} catch (IOException e) {e. printStackTrace ();} return new ModelAndView ("exception/net_error");} else if (ex instanceof AjaxException) {System. out. println ("-=");} return new ModelAndView ("exception/exception ");
}}
Add a custom exception handling module to the configuration file
Error page display:
Error. jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
Error Page
Error Message
Error description
$ {ErrorTips}
Error exception information Stack
$ {Ex}
Eception. jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
Exception page
Module Development in progress. Please wait ......
2. implement unified Exception Handling Based on the @ ControllerAdvice annotation to easily return Common exceptions and Ajax exception information and customize Web layer Exception Handling
WebExceptionHandler. java
Package com. jay. platform. exception. handler; import java. io. IOException; import java.net. connectException; import java.net. socketTimeoutException; import javax. servlet. http. httpServletRequest; import javax. servlet. http. httpServletResponse; import org. apache. log4j. logger; import org. apache. shiro. authz. unauthorizedException; import org. springframework. http. httpStatus; import org. springframework. web. bind. servle TRequestUtils; import org. springframework. web. bind. annotation. controllerAdvice; import org. springframework. web. bind. annotation. exceptionHandler; import org. springframework. web. bind. annotation. responseStatus; import org. springframework. web. context. request. nativeWebRequest; import org. springframework. web. servlet. modelAndView; import com. jay. platform. exception. ajaxException; import com. jay. platform. utils. da TeUtil;/*** @ ClassName: WebExceptionHandler * @ Description: exception processor on the Web layer. Here, you can write multiple methods to handle different exceptions and process page Jump requests, jump to the error page specified by the exception. * You can also process Ajax requests. Based on the failure, different prompts are displayed on the page. * operateExp: process common requests * operateExpAjax: handle Ajax requests * @ author Jay He * @ date 5:16:37 on April 9, May 27, 2015 **/@ ControllerAdvicepublic class WebExceptionHandler {Logger logger = Logger. getLogger (WebExceptionHandler. class);/** if UnauthorizedException is thrown Intercepted by the exception processor to display no permission information */@ ExceptionHandler ({UnauthorizedException. class}) @ ResponseStatus (HttpStatus. UNAUTHORIZED) public ModelAndView unauthenticatedException (NativeWebRequest request, UnauthorizedException e) {ModelAndView mv = new ModelAndView (); mv. addObject ("exception", e); mv. setViewName ("base/exception/unauthorized"); return mv;}/*** @ Title: operateExp * @ Description: global exception Control, recording logs * any method has an exception Normally, it will be intercepted by this method. Then, output the log. Encapsulate the Map and return the error message to the page: * Note: the error message returned to the page is only used during development. After going online, remove the error page, only log logs can be printed to prevent information leakage * @ param: @ param ex * @ param: @ param request * @ return: String * @ throws: */@ ExceptionHandler (RuntimeException. class) public String operateExp (RuntimeException ex, HttpServletRequest request) {logger. error (ex. getMessage (), ex); logger.info ("*************** ------ the exception information has been recorded (" + DateUtil. getNow ("yyyy-MM-dd HH: mm: ss") + ")-------* * ********* "); Request. setAttribute ("errorTips", ex. getMessage (); request. setAttribute ("ex", ex); return "exception/error";}/** records Ajax exception logs, and transmits the error Ajax error information (write-back) to the foreground for display, * The error message -- data. responseText: the error message sent in the background is ** eg: * $. ajax ({type: 'get', dataType: "json", url: ctx + '/test/test', accept: "application/json", success: function (data) {console. log (data) ;}, error: fun Ction (data, errorThrown) {console. log (data); alert ("error" + data. responseText) ;}}); */@ ExceptionHandler (AjaxException. class) public void operateExpAjax (AjaxException ex, HttpServletResponse response) throws IOException {logger. error (ex. getMessage (), ex); logger.info ("*************** ------ the exception information has been recorded (" + DateUtil. getNow ("yyyy-MM-dd HH: mm: ss") + ")-------***********"); // write Ajax exception information back to the foreground for page prompt respon Se. getWriter (). write ("sorry, Ajax request Error !!! ") ;}@ ExceptionHandler (ConnectException. class) public void operateExpNetException (ConnectException ex, HttpServletResponse response) throws IOException {logger. error (ex. getMessage (), ex); logger.info ("*************** ------ the exception information has been recorded (" + DateUtil. getNow ("yyyy-MM-dd HH: mm: ss") + ")-------***********"); // write the Ajax exception information back to the foreground for the page prompt response. getWriter (). write ("sorry, network connection Error !!! ");}}
Exception Test
Package com. jay. platform. controller. test; import java.net. connectException; import java. util. hashMap; import java. util. map; import org. springframework. stereotype. component; import org. springframework. stereotype. controller; import org. springframework. web. bind. annotation. requestMapping; import org. springframework. web. bind. annotation. requestMethod; import org. springframework. web. bind. annotation. responseBody; import com. jay. platform. annotation. ajaxExceptionHandler; import com. jay. platform. exception. ajaxException; @ Component @ Controller () @ RequestMapping ("exception") public class ExceptionHandlerTestController {@ RequestMapping ("test") public String getIt () {return "exception/test";} @ RequestMapping (value = "/common", method = RequestMethod. GET) public Map
CommonExcetion () throws RuntimeException {Map
Map = new HashMap
(); Int I = 10; if (I = 10) {throw new RuntimeException ("RunTime exception");} return map ;} @ AjaxExceptionHandler (tips = "try", description = "Haha") @ RequestMapping (value = "/ajax/net", method = RequestMethod. GET) @ ResponseBody public Map
AjaxConnectionExcetion () throws ConnectException {Map
Map = new HashMap
(); Int I = 10; if (I = 10) {throw new ConnectException ("test network connection exception");} return map ;} @ RequestMapping (value = "/ajax/common", method = RequestMethod. GET) @ ResponseBody public Map
AjaxExcetion () throws AjaxException {Map
Map = new HashMap
(); Int I = 10; if (I = 10) {throw new AjaxException ("test Ajax exception");} return map ;}}
Front-end page
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%><%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<% @ Include file = ".../common/meta. jsp" %> <script src = "$ {jqueryCtxPath}/jquery-ui-1.11.2.custom/jquery-ui.min.js"> </script> Normal exception handling test Ajax testing of network connection exceptions Ajax testing of Common exceptions<Script type = "text/javascript"> $ (document ). ready (function () {$ ("# test1 "). click (function () {$. ajax ({type: 'get', dataType: "json", url: ctx + '/exception/ajax/net', accept: "application/json", success: function (data) {console. log (data) ;}, error: function (data, errorThrown) {console. log (data); alert ("error" + data. responseText) ;}}) ;}); $ ("# test2 "). click (function () {$. ajax ({type: 'get', dataType: "json", url: ctx + '/exception/ajax/common', accept: "application/json", success: function (data) {console. log (data) ;}, error: function (data, errorThrown) {console. log (data); alert ("error" + data. responseText) ;}}) ;}); </script>
Page Result demonstration