Spring-Boot(五) 全局异常处理

本文介绍了在Spring Boot中如何进行全局异常处理,包括通过@ControllerAdvice和@ExceptionHandler注解实现对不同类型的异常处理,并展示了如何返回定制化的HTML页面及JSON响应。

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

http://nealma.com/2016/05/30/spring-boot-5-exception/

 
### 前言

    广大码农同胞在写程序的时候,总是会遇到处理各种Exception,神马空指针啦,
    再有就是处理DataBase的IO异常啦,反正哪都有他们的影子,真是阴魂不散啊。但是呢,
    你又不能置之不理,那就求救于Spring的全局处理吧

:)~
开发环境:
OS: Mac 10.11.6
IDE: IDEA
Build: Maven

    Spring-Boot默认实现了简单的错误页面,但是那个真是惨不忍睹。追求用户体验的你,当然想
    换成自己的页面了,看着美美哒。

    在实际工作中,我们不可能都是一出错就跳到html页面,根据我们自己的业务,我们通常还要以接口的形式
    返回固定格式的数据,最多的就是json啦。

下面就以html和json两种形式介绍如何实现。

### html

    现在只要能用注解,谁还实用xml来配置啊。
    正好这里涉及到两个annotation类:
    * @ControllerAdvice 全局异常处理类,不再需要每个Controller里一一定义
    * @ExceptionHandler 定义针对每种类型的Exception

    当然啦,如果你在业务中已经trycatch啦,那就别指望被处理了,你自己都处理了
    别人当然不操心了

```java

/**
 * 全局异常处理类
 */
@ControllerAdvice
public class GlobalExceptionHandler {

    protected final Logger LOGGER = LoggerFactory.getLogger(getClass());

    @ExceptionHandler(value = NullPointerException.class)
    public ModelAndView defaultErrorHandler(HttpServletRequest req, Exception e) throws Exception {
        LOGGER.error("[error] --> {}", e);
        ModelAndView mav = new ModelAndView();
        mav.addObject("exception", e);
        mav.addObject("url", req.getRequestURL());
        mav.setViewName("error");
        return mav;
    }
}

```

### JSON

    在前面的基础上,添加输出json的方法,其中@ResponseBody是必须条件
```java
/**
 * 全局异常处理类
 */
@ControllerAdvice
public class GlobalExceptionHandler {

    protected final Logger LOGGER = LoggerFactory.getLogger(getClass());

    @ExceptionHandler(value = NullPointerException.class)
    public ModelAndView defaultErrorHandler(HttpServletRequest req, Exception e) throws Exception {
        LOGGER.error("[error] --> {}", e);
        ModelAndView mav = new ModelAndView();
        mav.addObject("exception", e);
        mav.addObject("url", req.getRequestURL());
        mav.setViewName("error");
        return mav;
    }

    @ExceptionHandler(value = AppException.class)
    @ResponseBody
    public MsgOut json(Exception ex) {
        //TODO:记录日志
        LOGGER.error("AppException", ex);

        return MsgOut.error(ex);
    }
}
```
### 结束
    在Spring-Boot中,没有被全局处理类(GlobalExceptionHandler)捕获的异常,ErrorController会帮你补漏。
    如果你使用Spring Validation来校验,要成功捕获 MethodArgumentNotValidException,
    在控制器方法上就不能定义 BindingResult 参数接收校验结果,
    不然如果校验失败 Spring 是不会抛出 MethodArgumentNotValidException 异常的,
    自然而然在我们的 GlobalExceptionHandler 就无法处理了。

转载于:https://my.oschina.net/nealma/blog/855214

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值