該方法是在 http://www.javashuo.com/article/p-hahliwfu-kp.html 上的某一方面擴展,使其在異常(包括RuntimeException和各類自定義異常)的抓取與前端顯示上的統一。前端
此處class爲該ExceptionAspect.java的路徑java
<!-- 異常捕獲aop --> <bean id="exceptionHandler" class="*.*.ExceptionAspect" />
這裏取了個巧:Pointcut切點選擇了全部被@RequestMapping註解修飾的方法,按照代碼規範,全部被註解修飾的方法均在controller裏。web
利用aop的around(環繞),對異常進行抓取並進行相應的處理ajax
同時判斷其是否爲ajax請求,同時可根據抓取的異常裏的e.getMessage()來接收自定義異常的報錯內容,使其交互更符合實際需求。spring
/** * @Description: 切面:統一的異常處理 */ @Aspect @Component public class ExceptionAspect extends BaseAction { @Autowired private HttpServletRequest request; //日誌相關的service層,將相關數據以日誌形式保存下來 @Resource private SysLogService sysLogService; // Controller層切點 @Pointcut("@annotation(org.springframework.web.bind.annotation.RequestMapping)") //@annotation用於匹配當前執行方法持有指定註解的方法; public void exceptionAspect() { } @Around("exceptionAspect()") public Object around(ProceedingJoinPoint joinPoint){ Object object = null; Result result = new Result(); try { object = joinPoint.proceed(); return object; } catch (Exception e) { e.printStackTrace(); String message = e.getMessage(); if(StringUtils.isNotBlank(message)){ if(message.length() > 100){ message = message.substring(0,100); } result.setMsg(message); }else { result.setMsg("" + e.getClass()); } sysLogService.saveByJoinPoint(joinPoint,SecurityConstants.OPER_LOG_STATUS.OPER_LOG_STATUS_FAIL_4ENUM.getValue(),result.getMsg()); } catch (Throwable throwable) { throwable.printStackTrace(); } //request.getHeader("x-requested-with")爲 null,則爲傳統同步請求,爲 XMLHttpRequest,則爲 Ajax 異步請求。 if("XMLHttpRequest".equals(request.getHeader("x-requested-with"))){ return result;//是ajax請求 } else { Map<String,Object> context = new HashMap<String,Object>(); context.put("result",result); JSONObject jsonObject = coverJson("/test/common/page/error.vm",context); ModelAndView mav = new ModelAndView("/common/page/error"); mav.addAllObjects(jsonObject); return mav; } } }
全部被@RequestMapping註解修飾的方法(按照代碼規範,均在controller層中),一旦拋出異常,均會被該ExceptionAspect.java抓取到。若異常已被方法自身try catch到,則不會被抓取。同時可將Exception的報錯類型和報錯信息以開發者須要的形式或保存到日誌中,或展現在前端頁面上。json