Spring MVC统一异常处理(包含普通请求异常和ajax请求异常)

本文介绍如何在Spring MVC中统一处理控制器层的异常,包括普通请求与AJAX请求。通过实现HandlerExceptionResolver接口并重写resolveException方法,可以区分不同类型的请求并给出相应的错误提示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  当controller层出现异常时,对于普通的请求异常我们在web.xml里配置一个统一的跳转页面来提示用户,如下:

<error-page>
     <error-code>500</error-code>
     <location>/500.html</location>
</error-page>

  而对于ajax请求抛出的异常呢,让ajax请求自己捕获显然是不友好的,虽然用户察觉不出什么,但是通过浏览器查看请求返回时,出现服务器返回500错误显然是不友好。所以这里统一处理一下ajax请求,友好的提示用户错误信息。

  在Spring MVC中,所有用于处理在请求映射和请求处理过程中抛出的异常的类,都要实现HandlerExceptionResolver接口。HandlerExceptionResolver接口有一个方法resolveException,当controller层出现异常之后就会进入到resolveException这个方法中。

  下面我们直接实现HandlerExceptionResolver接口,重写resolveException方法,代码如下: 

public class ExceptionResolver implements HandlerExceptionResolver {

    private static Logger logger = LogManager.getLogger(ExceptionResolver.class);

    @Override
    public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception exception) {
        LogUtil.error("", request.getRequestURL().toString(), exception, PlatformNameEnum.DMS, request.getParameterMap(), "");

        // 判断是否ajax请求
        if ((request.getHeader("accept").indexOf("application/json") > -1 || (request
                .getHeader("X-Requested-With") != null && request.getHeader(
                "X-Requested-With").indexOf("XMLHttpRequest") > -1))) {
            // 如果是ajax请求,JSON格式返回
            try {
                ResultVo resultVo = new ResultVo(false);
                response.setContentType("application/json;charset=UTF-8");
                PrintWriter writer = response.getWriter();
                // 为安全起见,只有业务异常我们对前端可见,否则统一归为系统异常
                if (exception instanceof BusinessException) {
                    resultVo.setResultAndCode(false, ((BusinessException) exception).getErrorCode(), ((BusinessException) exception).getErrorMessage());
                } else {
                    resultVo.setResultAndCode(false, DmsErrorCode.DMS_ERR_100000.getCode(), "系统异常,请联系管理员");
                }
                writer.write(JSON.toJSONString(resultVo));
                writer.flush();
                writer.close();
            } catch (IOException e) {
                LogUtil.error("", request.getRequestURL().toString(), exception, PlatformNameEnum.DMS, request.getParameterMap(), "");
                e.printStackTrace();
            }
        }
        //对于非ajax请求,我们都统一跳转到500.html页面
        return null;
    }
} 

  另外,我们需要在springmvc配置文件添加如下配置:

<!-- 框架异常处理Handler -->

<bean id="exceptionResolver" class="com.zcz.exceptionresolver.MyExceptionResolver"></bean>

  到此整个异常处理就结束了。

 

 

转载于:https://www.cnblogs.com/zcz527/p/7723463.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值