SpringMVC 全局异常处理

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);
    }*/
});
相关文章
相关标签/搜索