SpringMVC 异常处理有几种,这里使用Spring MVC提供的SimpleMappingExceptionResolverjava
1.定义springMVC全局异常处理类ajax
<!-- springmvc提供的简单异常处理器 --> <bean class="common.exception.CustomExceptionResolver"> <!-- 定义默认的异常处理页面 --> <property name="defaultErrorView" value="error/500"/> <!-- 定义异常处理页面用来获取异常信息的变量名,也可不定义,默认名为exception --> <property name="exceptionAttribute" value="ex"/> <!-- 定义须要特殊处理的异常 <property name="exceptionMappings"> <props> <prop key="CustomException">/WEB-INF/jsp/custom_error.jsp</prop> </props> </property> --> </bean>
2.CustomExceptionResolver.java 异常处理类spring
/** * 全局异常处理 * @author rico 2016年5月20日 * */ public class CustomExceptionResolver extends SimpleMappingExceptionResolver { // 默认系统exception 提示信息 private static final String DEFAULT_EXCEPTION_MESSAGE = "系统繁忙"; @Override protected ModelAndView doResolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) { if(this.isAjaxRequest(request)) { try { // ajax 请求 //logger.error(ex.getMessage(), ex); response.setContentType("application/json;charset=UTF-8"); response.setCharacterEncoding("UTF-8"); // status 505, 避免与其余错误码冲突 response.setStatus(505); PrintWriter writer = response.getWriter(); if(ex instanceof BusinessException) { writer.write(ex.getMessage()); } else { writer.write(DEFAULT_EXCEPTION_MESSAGE); } writer.flush(); } catch (IOException e) { e.printStackTrace(); } } else { if(ex instanceof BusinessException) { } else { ex = new BusinessException(StringUtils.isBlank(ex.getMessage())?DEFAULT_EXCEPTION_MESSAGE:ex.getMessage(), ex); } return super.doResolveException(request, response, handler, ex); /*// Expose ModelAndView for chosen error view. String viewName = determineViewName(ex, request); if (viewName != null) { // Apply HTTP status code for error views, if specified. // Only apply it if we're processing a top-level request. Integer statusCode = determineStatusCode(request, viewName); if (statusCode != null) { applyStatusCodeIfPossible(request, response, statusCode); } return getModelAndView(viewName, ex, request); } else { return null; }*/ } return null; } /** * 判断是否为ajax请求 * @param request * @return */ private boolean isAjaxRequest(HttpServletRequest request) { String requestType = request.getHeader("X-Requested-With"); if (requestType != null && requestType.equals("XMLHttpRequest")) { return true; } else { return false; } } }
3.错误返回处理json
A.页面返回错误mvc
<div class="centers"> <div class="title">错误框</div> <span class="error"></span> <span class="text"><h1>系统发生内部错误。请与管理员联系!</h1></span> <div class="text"><%=ex.getMessage() %></div> <input type="hidden" id="responseText" value="<%=ex.getMessage() %>"/> </div>
B.Ajax返回错误,引入js文件,jQuery ajax全局事件处理app
/** * ajax 全局事件 */ $(document).ajaxComplete(function(event, xhr, settings ) { }); $(document).ajaxError(function(event, xhr, settings) { var responseText = xhr.responseText; if(responseText==null || responseText=='') { responseText = '系统发生错误.'; } alert(responseText); /* if(xhr.status == '505') { var responseText = $('#responseText').val(); if(responseText==null || responseText=='') { responseText = '系统发生错误.'; } alert(responseText); }*/ });