/** * 源碼接口定義 */ public interface HandlerExceptionResolver { ModelAndView resolveException( HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex); }
@Component public class ExceptionHandler implements HandlerExceptionResolver { @Override public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) { // 判斷是否AJAX請求 if (request.getHeader("x-requested-with") != null && request.getHeader("x-requested-with").equalsIgnoreCase("XMLHttpRequest")) { try { response.setContentType("application/json;charset=UTF-8"); PrintWriter writer = response.getWriter(); Map<String, Object> map = new HashMap<String, Object>(); map.put("success", false); if (ex instanceof MessageException) {// 安全起見,業務異常前端可見,不然統一歸爲系統異常 map.put("errorMsg", ex.getMessage()); } else { map.put("errorMsg", "系統異常!"); } Gson gson = new Gson(); writer.write(gson.toJson(map)); writer.flush(); writer.close(); } catch (IOException e) { e.printStackTrace(); } } Map<String, Object> model = new HashMap<>(); return new ModelAndView("/error", model); } }
ExceptionHandler 實現 HandlerExceptionResolver接口,須要添加 @Component 註解,或者增長配置文件 <bean class="com.xxg.ExceptionHandler " /> 。 前端
配置完成,後臺Controller中全部的業務異常都會由ExceptionHandler來處理。java