SpringMVC 全局异常处理

本文介绍在SSM项目中如何使用HandlerExceptionResolver和@ExceptionHandler注解处理异常,以减少异常对系统返回结果的影响,实现异常的集中处理。

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

前言

本篇博文使用FastJson 定义message-converters 来处理SpringMVC 返回的对象,转化为Json 字符串输出到客户端,关于FastJson和SpringMVC的配置网上有博文,这里就不在描述了。

解决的场景

当我们构建SSM项目,我们的业务逻辑总会有各种各样的异常发生,为了减少异常对我们系统返回结果的影响,以及对这些异常进行集中处理,SpringMVC 给我们提供了两种方式解决。

方案一【HandlerExceptionResolver】:

  1. 传统的方式 在代码中实现包org.springframework.web.servlet下的接口 HandlerExceptionResolver,并且实现 resolveException 方法。
  2. resolveException 参数:
    HttpServletRequest request
    HttpServletResponse response
    Object handler : 处理这个url请求 的Controller 中的method 方法
    Exception ex: 业务逻辑抛出的异常
  3. 代码解释: 这里仅仅用于捕获异常,并且返回统一定义结果ResultStatus 【正常业务也是返回ResultStatus 】,通过Code告知客户端后台运行结果,正常结果 code=“00000”:
public class TestExceptionHandle implements HandlerExceptionResolver{

    @Nullable
    @Override
    public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, @Nullable Object handler, Exception ex) {
        try {
            ResultStatus resultStatus = new ResultStatus();
            resultStatus.setCode(10000);
            resultStatus.setMsg("Exception");

            PrintWriter pw = response.getWriter();
            pw.write(JSONObject.toJSONString(resultStatus));
            pw.close();
        } catch (IOException e) {
            throw new IllegalStateException(e);
        }
        return new ModelAndView();

    }
}
  1. Springmvc.xml 加入以下 配置,将异常处理器加载到SprinMVC中:
<!--HandlerExceptionResolver 异常处理器-->
<bean class="com.lot.utils.TestExceptionHandle"/>
  1. 客户端返回:
{"code":100000,"msg":"Exception"}

方案二【使用注解@ExceptionHandler】:

  1. Spring 从4.x版本开始提倡java配置和注解结合使用,慢慢离开xml繁琐的配置,所以方案二是方案一的升级版,此方法需要两个新注解
    @ControllerAdvice : ControllerAdvice拆分开来就是Controller Advice,功能类似于Spring的Aop。其中包含属性 basePackages,执行切点位置,也可以省略表示全局
    @ExceptionHandler :作用主要在于声明一个或多个类型的异常,当符合条件的Controller抛出这些异常之后将会对这些异常进行捕获,然后按照其标注的方法的逻辑进行处理,从而改变返回的视图信息
  2. 代码示例,无需XML 配置:
@ControllerAdvice
public class ExceptionControllerAdvice {

    /**
     * 全局异常捕捉处理
     * @param ex
     * @return
     */
    @ResponseBody
    @ExceptionHandler(value = Exception.class)
    public ResultStatus errorHandler(Exception ex) {
        ResultStatus resultStatus = new ResultStatus();
        resultStatus.setCode(1100000);
        resultStatus.setMsg("Exception");
        return resultStatus;
    }
}

总结:

方案一是目前大多数公司都在用的方式,但是方案二是进年来Spring推崇的Java Config思想, 目的减少XML配置,SpringBoot 就是很好的一个示例!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值