springMVC实现全局异常处理

来源:互联网 发布:申万证券交易软件 编辑:程序博客网 时间:2024/06/04 18:31

你还在为控制器和service层中的try catch代码段感到烦恼吗,每写一个方法,都要进行try catch或者抛异常处理,然而捕获到异常之后的处理无非就是告诉用户,后台程序出错了,如果请求的是页面,则返回用户一个错误页面,告诉用户后台程序出错了,如果是ajax请求呢,则要返回一个错误代码,告诉前端程序,后台运行出错了。所以综上所属,无论后台出现什么样的异常,我们只需要在后台记录下异常日志。然后提示用户后台程序出错了即可。所以,根据springmvc中提供的HandlerExceptionResolver接口,然后自己实现了一个全局异常处理类,只需要在spring中注册游戏i啊即可。

直接上代码

package com.jd.trial.common.exception;import java.io.IOException;import javax.servlet.ServletException;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import com.jd.trial.common.json.JsonResult;import com.jd.trial.common.utils.AjaxUtils;import org.apache.log4j.Logger;import org.springframework.web.servlet.HandlerExceptionResolver;import org.springframework.web.servlet.ModelAndView;/** * 全局异常处理 * * @ClassName    : ExceptionHandler * @Author : *** * @CreateDate : 2014年4月23日 下午2:33:43 */public class ExceptionHandler implements HandlerExceptionResolver {    private final Logger log = Logger.getLogger(getClass());    private String ajaxErrorCode = "ERROR";//ajax 请求错误提示    private String errorUrl = "/showError.htm";//普通请求错误后转发的请求    public String getAjaxErrorCode() {        return ajaxErrorCode;    }    public void setAjaxErrorCode(String ajaxErrorCode) {        this.ajaxErrorCode = ajaxErrorCode;    }    public String getErrorUrl() {        return errorUrl;    }    public void setErrorUrl(String errorUrl) {        this.errorUrl = errorUrl;    }    /**     * 全局异常处理     */    @Override    public ModelAndView resolveException(HttpServletRequest request,                                         HttpServletResponse response, Object handler, Exception ex) {        log.error(ex.toString(), ex);        if (isAjaxRequest(request)) {            log.error(" ajax request error ,return " + ajaxErrorCode);            try {                AjaxUtils.write(response, ajaxErrorCode);            } catch (IOException e) {                log.error(e.toString(), e);            }            return null;        } else {            log.error("normal request error ,return "                    + request.getContextPath() + errorUrl);            try {                //request.getRequestDispatcher(errorUrl).forward(request, response);                response.sendRedirect(errorUrl);            } catch (IOException e) {                log.error(e.toString(), e);            }        }        return new ModelAndView();    }    /**     * 判断request是否为ajax请求     *     * @param request     * @return : boolean     * @Method_Name : isAjaxRequest     * @Creation Date : 2014年4月21日 上午10:51:07     * @version : v1.00     * @Author : ***     * @Update Date :     * @Update Author :     */    private boolean isAjaxRequest(HttpServletRequest request) {        // return request.getRequestURI().startsWith("/api");        String requestType = request.getHeader("X-Requested-With");        return requestType != null && requestType.equals("XMLHttpRequest");    }}

然后在spring-servlet.xml中注册即可,如下示例

    <!-- 全局异常处理配置 start -->    <bean id="exceptionResolver" class="com.jd.trial.common.exception.ExceptionHandler">        <property name="ajaxErrorCode" value="${ajaxErrorCode}"></property>        <!-- ajax 请求错误后返回的错误代码,必须int类型 -->        <property name="errorUrl" value="${errorUrl}"></property>        <!-- 普通请求错误后转发的请求 -->    </bean>    <!-- 全局异常配置 end -->



0 0