博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Springboot全局异常处理GlobalExceptionHandler
阅读量:6530 次
发布时间:2019-06-24

本文共 4212 字,大约阅读时间需要 14 分钟。

全局异常处理

自定义异常

在应用开发过程中,除系统自身的异常外,不同业务场景中用到的异常也不一样,为了与标题 轻松搞定全局异常 更加的贴切,定义个自己的异常,看看如何捕获…

package com.baizhi.exception;public class CustomException extends RuntimeException {    private static final long serialVersionUID = 4564124491192825748L;    private int code;    public CustomException() {        super();    }    public CustomException(int code, String message) {        super(message);        this.setCode(code);    }    public int getCode() {        return code;    }    public void setCode(int code) {        this.code = code;    }}复制代码

异常信息模板

定义返回的异常信息的格式,这样异常信息风格更为统一

public class ErrorResponseEntity {    private int code;    private String message;    // 省略 get set}复制代码

异常处理(关键)

注解概述

  • @ControllerAdvice 捕获 Controller 层抛出的异常,如果添加 @ResponseBody 返回信息则为JSON格式。
  • @RestControllerAdvice 相当于 @ControllerAdvice@ResponseBody 的结合体。
  • @ExceptionHandler 统一处理一种类的异常,减少代码重复率,降低复杂度。

创建一个 GlobalExceptionHandler 类,并添加上 @RestControllerAdvice 注解就可以定义出异常通知类了,然后在定义的方法中添加上 @ExceptionHandler 即可实现异常的捕捉…

package com.baizhi.controller;import com.baizhi.exception.CustomException;import com.baizhi.exception.ErrorResponseEntity;import org.springframework.http.HttpHeaders;import org.springframework.http.HttpStatus;import org.springframework.http.ResponseEntity;import org.springframework.web.bind.MethodArgumentNotValidException;import org.springframework.web.bind.annotation.ExceptionHandler;import org.springframework.web.bind.annotation.RestControllerAdvice;import org.springframework.web.context.request.WebRequest;import org.springframework.web.method.annotation.MethodArgumentTypeMismatchException;import org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;@RestControllerAdvicepublic class GlobalExceptionHandler extends ResponseEntityExceptionHandler {    /**     * 定义要捕获的异常 可以多个 @ExceptionHandler({})     *     * @param request  request     * @param e        exception     * @param response response     * @return 响应结果     */    @ExceptionHandler(CustomException.class)    public ErrorResponseEntity customExceptionHandler(HttpServletRequest request, final Exception e, HttpServletResponse response) {        response.setStatus(HttpStatus.BAD_REQUEST.value());        CustomException exception = (CustomException) e;        return new ErrorResponseEntity(exception.getCode(), exception.getMessage());    }    /**     * 捕获  RuntimeException 异常     * TODO  如果你觉得在一个 exceptionHandler 通过  if (e instanceof xxxException) 太麻烦     * TODO  那么你还可以自己写多个不同的 exceptionHandler 处理不同异常     *     * @param request  request     * @param e        exception     * @param response response     * @return 响应结果     */    @ExceptionHandler(RuntimeException.class)    public ErrorResponseEntity runtimeExceptionHandler(HttpServletRequest request, final Exception e, HttpServletResponse response) {        response.setStatus(HttpStatus.BAD_REQUEST.value());        RuntimeException exception = (RuntimeException) e;        return new ErrorResponseEntity(400, exception.getMessage());    }    /**     * 通用的接口映射异常处理方     */    @Override    protected ResponseEntity handleExceptionInternal(Exception ex, Object body, HttpHeaders headers,                                                             HttpStatus status, WebRequest request) {        if (ex instanceof MethodArgumentNotValidException) {            MethodArgumentNotValidException exception = (MethodArgumentNotValidException) ex;            return new ResponseEntity<>(new ErrorResponseEntity(status.value(), exception.getBindingResult().getAllErrors().get(0).getDefaultMessage()), status);        }        if (ex instanceof MethodArgumentTypeMismatchException) {            MethodArgumentTypeMismatchException exception = (MethodArgumentTypeMismatchException) ex;            logger.error("参数转换失败,方法:" + exception.getParameter().getMethod().getName() + ",参数:" + exception.getName()                    + ",信息:" + exception.getLocalizedMessage());            return new ResponseEntity<>(new ErrorResponseEntity(status.value(), "参数转换失败"), status);        }        return new ResponseEntity<>(new ErrorResponseEntity(status.value(), "参数转换失败"), status);    }}复制代码

转载地址:http://ukxbo.baihongyu.com/

你可能感兴趣的文章
Asp.Net Core 轻松学-利用日志监视进行服务遥测
查看>>
LightSwitch社区资源搜集
查看>>
Android通讯录查询篇--ContactsContract.Data 二(续)
查看>>
IT人的自我导向型学习:开篇杂谈
查看>>
[原创]BizTalk动手实验系列目录
查看>>
HDU 4611Balls Rearrangement(思维)
查看>>
[LeetCode] Majority Element II
查看>>
minGW, cygwin, GnuWin32【C++的跨平台交叉编译问题】
查看>>
我的Dll(动态链接库)学习笔记(转)
查看>>
应用程序域
查看>>
有向图的拓扑排序算法JAVA实现
查看>>
HTML页面跳转的5种方法
查看>>
ArcGIS Engine开发之旅02--ArcGIS Engine中的类库
查看>>
李洪强-C语言5-函数
查看>>
开源监控利器grafana
查看>>
Android获取当前时间与星期几
查看>>
jenkins2 multibranch
查看>>
Css定位-定位
查看>>
sort,uniq命令
查看>>
am335x 电容屏驱动添加。
查看>>