前言:

SpringBoot的项目已经对有一定的异常处理了,但是对于我们开发者而言可能就不太合适了,因此我们需要对这些异常进行统一的捕获并处理。SpringBoot中有一个ControllerAdvice的注解,使用该注解表示开启了全局异常的捕获,我们只需在自定义一个方法使用ExceptionHandler注解然后定义捕获异常的类型即可对这些捕获的异常进行统一的处理。

自定义基础接口类

定义一个基础的接口类,自定义的错误描述枚举类需实现该接口。
代码如下:

public interface BaseErrorInfoInterface {/** 错误码*/String getCode();/** 错误描述*/String getMsg();
}

自定义枚举类

然后自定义一个枚举类,并实现该接口。
代码如下:

import lombok.Getter;@Getter
public enum ErrorCodeAndMsg  implements BaseErrorInfoInterface{SUCCESS("200", "成功!"),BODY_NOT_MATCH("400","请求的数据格式不符!"),SIGNATURE_NOT_MATCH("401","请求的数字签名不匹配!"),NOT_FOUND("404", "未找到该资源!"),INTERNAL_SERVER_ERROR("500", "服务器内部错误!"),SERVER_BUSY("503","服务器正忙,请稍后再试!"),STUDENG_NULL("0003", "学号不能为空");private String code;private String msg;ErrorCodeAndMsg(String code, String msg) {this.code = code;this.msg = msg;}public String getCode() {return code;}public String getMsg() {return msg;}
}

自定义异常类

定义一个异常类,用于处理我们发生的业务异常。
代码如下:

import lombok.Getter;/*** 统一异常捕获类* Created by Tiger on 2018/10/9.*/
@Getter
public class StudentException extends RuntimeException{private String code;private String msg;public StudentException() {super();}public StudentException(BaseErrorInfoInterface errorInfoInterface) {super(errorInfoInterface.getCode());this.code = errorInfoInterface.getCode();this.msg = errorInfoInterface.getMsg();}public StudentException(BaseErrorInfoInterface errorInfoInterface, Throwable cause) {super(errorInfoInterface.getCode(), cause);this.code = errorInfoInterface.getCode();this.msg = errorInfoInterface.getMsg();}public StudentException(String errorMsg) {super(errorMsg);this.msg = errorMsg;}public StudentException(String errorCode, String errorMsg) {super(errorCode);this.code = errorCode;this.msg = errorMsg;}public StudentException(String errorCode, String errorMsg, Throwable cause) {super(errorCode, cause);this.code = errorCode;this.msg = errorMsg;}public String getErrorCode() {return code;}public void setErrorCode(String errorCode) {this.code = errorCode;}public String getErrorMsg() {return msg;}public void setErrorMsg(String errorMsg) {this.msg = errorMsg;}public String getMessage() {return msg;}@Overridepublic Throwable fillInStackTrace() {return this;}
}

自定义数据格式

顺便这里定义一下数据的传输格式。
代码如下:

public class ResultBody {/*** 响应代码*/private String code;/*** 响应消息*/private String message;/*** 响应结果*/private Object result;public ResultBody() {}public String getCode() {return code;}public void setCode(String code) {this.code = code;}public String getMessage() {return message;}public void setMessage(String message) {this.message = message;}public Object getResult() {return result;}public void setResult(Object result) {this.result = result;}/*** 成功** @return*/public static ResultBody success() {return success(null);}/*** 成功* @param data* @return*/public static ResultBody success(Object data) {ResultBody rb = new ResultBody();rb.setCode(ErrorCodeAndMsg.SUCCESS.getCode());rb.setMessage(ErrorCodeAndMsg.SUCCESS.getMsg());rb.setResult(data);return rb;}/*** 失败*/public static ResultBody error(BaseErrorInfoInterface errorInfo) {ResultBody rb = new ResultBody();rb.setCode(errorInfo.getCode());rb.setMessage(errorInfo.getMsg());rb.setResult(null);return rb;}/*** 失败*/public static ResultBody error(String code, String message) {ResultBody rb = new ResultBody();rb.setCode(code);rb.setMessage(message);rb.setResult(null);return rb;}/*** 失败*/public static ResultBody error( String message) {ResultBody rb = new ResultBody();rb.setCode("-1");rb.setMessage(message);rb.setResult(null);return rb;}/*@Overridepublic String toString() {return JSONObject.toJSONString(this);}*/
}

自定义全局异常处理类

最后我们在来编写一个自定义全局异常处理的类。
代码如下:

@ControllerAdvice
public class GlobalExceptionHandler {private static final Logger logger = LoggerFactory.getLogger(GlobalExceptionHandler.class);/*** 处理自定义的业务异常* @param req* @param e* @return*/@ExceptionHandler(value = BizException.class)  @ResponseBody  public  ResultBody bizExceptionHandler(HttpServletRequest req, BizException e){logger.error("发生业务异常!原因是:{}",e.getErrorMsg());return ResultBody.error(e.getErrorCode(),e.getErrorMsg());}/*** 处理空指针的异常* @param req* @param e* @return*/@ExceptionHandler(value =NullPointerException.class)@ResponseBodypublic ResultBody exceptionHandler(HttpServletRequest req, NullPointerException e){logger.error("发生空指针异常!原因是:",e);return ResultBody.error(CommonEnum.BODY_NOT_MATCH);}/*** 处理其他异常* @param req* @param e* @return*/@ExceptionHandler(value =Exception.class)@ResponseBodypublic ResultBody exceptionHandler(HttpServletRequest req, Exception e){logger.error("未知异常!原因是:",e);return ResultBody.error(CommonEnum.INTERNAL_SERVER_ERROR);}
}

springboot搞定全局自定义异常相关推荐

  1. 搞定全局ID生成器:SpringBoot2.x 集成百度 uidgenerator

    点击上方 好好学java ,选择 星标 公众号重磅资讯,干货,第一时间送达 今日推荐:推荐19个github超牛逼项目!个人原创100W +访问量博客:点击前往,查看更多 作者:风.foxwho fo ...

  2. java 不重启部署_一篇文章带你搞定SpringBoot不重启项目实现修改静态资源

    一.通过配置文件控制静态资源的热部署 在配置文件 application.properties 中添加: #表示从这个默认不触发重启的目录中除去static目录 spring.devtools.res ...

  3. 一篇搞定 SpringBoot+Mybatis+Shiro 实现多角色权限管理

    初衷:我在网上想找整合springboot+mybatis+shiro并且多角色认证的博客,发现找了好久也没有找到想到的,现在自己会了,就打算写个博客分享出去,希望能帮到你. 原创不易,请点赞支持! ...

  4. SpringBoot的Web开发支持【超详细【一篇搞定】果断收藏系列】

    SpringBoot的Web开发支持 常用的服务器配置 使用Jetty服务器替换Tomcat 排除Tomcat的启动器,引入Jetty application.yml 编写入口程序 编写Control ...

  5. 3分钟搞定SpringBoot+Mybatis+druid多数据源和分布式事务

    在一些复杂的应用开发中,一个应用可能会涉及到连接多个数据源,所谓多数据源这里就定义为至少连接两个及以上的数据库了. 下面列举两种常用的场景: 一种是读写分离的数据源,例如一个读库和一个写库,读库负责各 ...

  6. 【springboot+easypoi】一行代码搞定excel导入导出

    原文:https://www.jianshu.com/p/5d67fb720ece 开发中经常会遇到excel的处理,导入导出解析等等,java中比较流行的用poi,但是每次都要写大段工具类来搞定这事 ...

  7. SpringBoot 就这一篇全搞定

    一.Hello Spring Boot 1.Spring Boot 简介 简化Spring应用开发的一个框架: 整个Spring技术栈的一个大整合: J2EE开发的一站式解决方案: 2.微服务 微服务 ...

  8. 从头撸到脚,SpringBoot 就一篇全搞定!

    一.Hello Spring Boot 1.Spring Boot 简介 简化Spring应用开发的一个框架: 整个Spring技术栈的一个大整合: J2EE开发的一站式解决方案: 2.微服务 微服务 ...

  9. SpringBoot 轻松搞定数据验证 (一)

    感谢作者: http://www.spring4all.com/article/1224 对于任何一个应用而言,客户端做的数据有效性验证都不是安全有效的,而数据验证又是一个企业级项目架构上最为基础的功 ...

最新文章

  1. Nature子刊:微生物系统的功能与功能冗余
  2. Linux 并发服务器雏形总结
  3. MongoDB的设计模式策略
  4. ABAP Text edit使用
  5. 兑吧:游戏化玩转用户运营的三驾马车
  6. 进程P1、P2、P3、P4和P5的前趋图如下图所示。若用PV操作控制进程P1~P5并发执行的过程,则需要设置6个信号S1、S2、S3、S4,且信号量S1~S4的初值都等于0。下图中a和b处应分别填写(
  7. 第三次学JAVA再学不好就吃翔(part28)--猜数字小游戏
  8. 基于REACT和.NET CORE集成WINDOWS身份验证
  9. vlookup函数练习_为什么职场要学excel函数?看这个案例演示:自动计算快递价格...
  10. 终于有人把幸存者偏差讲明白了
  11. c++ java setobjectarrayelement_java中jni的使用:C/C++操作java中的数组
  12. Rabbitmq消息队列(二) Hello World! 模拟简单发送接收
  13. IntelliJ IDEA使用技巧(四)——设置默认Maven的方法
  14. CSDN 的 Markdown 编辑器语法
  15. vb6与access数据库交互常见问题——未完待续
  16. Oracle数据库用户密码过期
  17. 百度地图获取经纬度的方式
  18. selenium处理12306登录
  19. Excel 2010中上下标的输入方法
  20. Android颜色对应的xml色值

热门文章

  1. java jobkey_Java JobBuilder.newJob方法代码示例
  2. eclipse项目如何变成web项目_IntelliJ IDEA 部署 Web 项目,终于搞懂了!
  3. 吴恩达《机器学习》第三章:矩阵和向量
  4. TensorFlow2.0:张量排序
  5. IOC的具体使用代码
  6. html过滤 -java_PHP过滤各种html标签
  7. 卡住 安装_【书中有路】弹簧式安全阀结构原理、故障解析、安装要点
  8. 视图可以修改表数据吗_Excel-数据透视表、数据透视图
  9. python commands_python之commands模块
  10. 若依如何解决请求地址存在中文出现异常?