在解決Controller層中的異常問題時,如果針對每個異常處理相對較為繁瑣。在SpringMVC中提供了HandlerExceptionResolver用於處理捕獲到的異常,從而重新定義返回給前端的數據展示方式:
1,實現HandlerExceptionResolver接口;
2,實現方法resolveException;
3,將自定義類注入到spring中:
若是在普通的web項目中則需要在springmvc的xml文件中手動注入<bean class="com...common.SpringExceptionResolver" />;
而若是在Springboot中直接用全局異常處理器即可(@ControllerAdvice結合@ExceptionHandler(Exception.class))
/** * 自定義異常返回方式 */ @Slf4j public class SpringExceptionResolver implements HandlerExceptionResolver{ @Override public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) { String url = request.getRequestURL().toString(); String defaultMsg = "System error"; String jsonView = "jsonView"; ModelAndView mv ; if (StringUtils.isEmpty(url)){ return null; } if(url.endsWith(".json") ){ //以.json結尾的請求為ajax請求 if(ex instanceof PermissionException || ex instanceof ParamException){ log.error("unknow ParamException or PermissionException exception , url:"+url,ex); JsonData result = JsonData.error(ex.getMessage()); mv = new ModelAndView(jsonView,result.toMap()); }else { log.error("unknow json exception , url :"+url,ex); JsonData result = JsonData.error(defaultMsg); mv = new ModelAndView(jsonView,result.toMap()); } }else if (url.endsWith(".page")){ //訪問頁面以.page結尾 log.error("unknow page exception , url:"+url,ex); JsonData result = JsonData.error(defaultMsg); //同樣也可以定義返回給前端的錯誤頁面mv = new ModelAndView(); mv.setView("500.html");這樣就會直接返回指定的500.html頁面了 mv = new ModelAndView(jsonView,result.toMap()); }else{ log.error("unknow exception , url:"+url,ex); JsonData result = JsonData.error(defaultMsg); mv = new ModelAndView(jsonView,result.toMap()); } return mv; } }
注:其中PermissionException 和 ParamException均為自定義的異常