Springboot项目统一异常处理

  一.接口返回值封装

  1. 定义Result对象,作为通用返回结果封装

  2. 定义CodeMsg对象,作为通用状态码和消息封装

  二.定义全局异常类

  三.定义异常处理类

  四.特殊处理404异常

  五.测试使用效果

  一.接口返回值封装

  基于目前大多数项目都采用前后端分离架构,所以后端接口统一返回值封装是比较重要的,便于前后端对接与统一处理。当然按各自项目约定实现即可,思路大同小异,下面是我的实现方式,仅供参考

  1. 定义Result对象,作为通用返回结果封装

  /**

  *

  @filename Result

  *

  *

  @description 通用返回结果封装

  *

  * @author llspace

  * @version 1.0

  * @since 2019/6/17 11:55

  **/

  @Data

  public class Result {

  private int code;

  private String msg;

  private T data;

  /**

  * 成功时候的调用

  */

  public static Result success(T data) {

  return new Result(data);

  }

  /**

  * 失败时候的调用

  */

  public static Result error(CodeMsg cm) {

  return new Result(cm);

  }

  private Result(T data) {

  this.code = 0;

  this.msg = "success";

  this.data = data;

  }

  private Result(CodeMsg cm) {

  if (cm == null) {

  return;

  }

  this.code = cm.getCode();

  this.msg = cm.getMsg();

  }

  }

  2. 定义CodeMsg对象,作为通用状态码和消息封装

  /**

  *

  @filename CodeMsg

  *

  *

  @description 通用状态码和消息封装

  *

  * @author llspace

  * @version 1.0

  * @since 2019/6/17 11:57

  **/

  @Data

  public class CodeMsg {

  //自定义状态码

  private int code;

  //消息信息

  private String msg;

  //通用异常 4001XX

  public static CodeMsg SUCCESS = new CodeMsg(0, "success");

  public static CodeMsg SERVER_ERROR = new CodeMsg(500100, "服务端异常");

  //模块1 4002XX

  //模块2 4003XX

  //模块3 4004XX

  private CodeMsg(int code, String msg) {

  this.code = code;

  this.msg = msg;

  }

  public CodeMsg fillArgs(Object... args) {

  int code = this.code;

  String message = String.format(this.msg, args);

  return new CodeMsg(code, message);

  }

  }

  二.定义全局异常类

  基于上面封装的CodeMsg实现GlobalException定义,异常继承RuntimeException

  /**

  *

  @filename GlobalException

  *

  *

  @description 全局异常信息

  *

  * @author llspace

  * @version 1.0

  * @since 2019/6/20 18:05

  **/

  @Data

  public class GlobalException extends RuntimeException {

  private static final long serialVersionUID = 1L;

  private CodeMsg codeMsg;

  public GlobalException(CodeMsg codeMsg) {

  super(codeMsg.toString());

  this.codeMsg = codeMsg;

  }

  }

  三.定义异常处理类

  @RestControllerAdvice作用等同于@ResponseBody加上@ControllerAdvice,会在所有带有@Controller或者@RestController注解的类上生效,还可以使用basePackages参数配置指定异常处理类生效的包

  /**

  *

  @filename GlobalExceptionHandler

  *

  *

  @description 全局异常处理类

  *

  * @author llspace

  * @version 1.0

  * @since 2019/6/20 18:07

  **/

  @RestControllerAdvice

  public class GlobalExceptionHandler {

  @ExceptionHandler(value = Exception.class)

  public Result exceptionHandler(HttpServletRequest request, Exception e){

  e.printStackTrace();

  if(e instanceof GlobalException) {

  GlobalException exception = (GlobalException) e;

  return Result.error(exception.getCodeMsg());

  }else if(e instanceof BindException) {

  BindException ex = (BindException) e;

  List errors = ex.getAllErrors();

  ObjectError error = errors.get(0);

  String msg = error.getDefaultMessage();

  return Result.error(CodeMsg.BIND_ERROR.fillArgs(msg));

  }else {无锡妇科医院哪家好 http://mobile.xasgyy.net/

  return Result.error(CodeMsg.SERVER_ERROR);

  }

  }

  四.特殊处理404异常

  spring boot默认不会抛出404异常(NoHandlerFoundException),所以在ControllerAdvice中捕获不到该异常,导致404总是跳过ContollerAdvice,直接显示ErrorController的错误页。需要改变配置,让404错误抛出异常(NoHandlerFoundException),这样便可在ControllerAdvice中捕获此异常。

  如果是restful项目改变配置即可实现捕获上述异常,在application.yml中添加:

  spring:

  mvc:

  throw-exception-if-no-handler-found: true

  resources:

  add-mappings: false

  注意:添加了如上配置会造成项目静态资源访问异常, 如果不是restful的项目这样配置就会有问题,所以就需要采用其他方式来处理了, 可以参考如下处理方法

  如果是带静态资源的项目我们要如何来处理404异常呢?

  断点下BasicErrorController类,查看下源码可知,errorHtml()方法默认会返回一个new ModelAndView(“error”, model),所以其实在classpath:/templates下自定义一个error.html即可,这样springboot默认的404错误就跳转到了自己项目下的error页面了,这种处理比较简单,如果想更好的封装错误页面,建议自己实现ErrorController接口,或者继承AbstractErrorController / BasicErrorController类来实现,当然前提是删除掉配置文件中上述的两个配置

  五.测试使用效果

  至此,统一异常处理就实现了,如下使用,

  if(loginVO == null) {

  throw new GlobalException(CodeMsg.SERVER_ERROR);

  }

  这样会抛出异常如下:

  GlobalException(codeMsg=CodeMsg(code=500100, msg=服务端异常))

  如果是404异常会跳项目自定义的error页面

  

  个人实现,仅供参考,有兴趣的小伙伴自己动手尝试吧!

Springboot项目统一异常处理的更多相关文章

  1. springmvc、 springboot 项目全局异常处理

    异常在项目中那是不可避免的,通常情况下,我们需要对全局异常进行处理,下面介绍两种比较常用的情况. 准备工作: 在捕获到异常的时候,我们通常需要返回给前端错误码,错误信息等,所以我们需要手动封装一个js ...

  2. SpringBoot之统一异常处理

    异常,不仅仅是程序运行状态的描述,还可以使得代码编写更加的规范   1.自定义异常:FieldValueInvalidException package com.geniuses.sewage_zer ...

  3. 从零开始的SpringBoot项目 ( 七 ) 统一返回结果集Result 和 异常处理

    import java.io.Serializable; import lombok.Data; import org.springframework.http.HttpStatus; @Data p ...

  4. 配置springboot在访问404时自定义返回结果以及统一异常处理

    在搭建项目框架的时候用的是springboot,想统一处理异常,但是发现404的错误总是捕捉不到,总是返回的是springBoot自带的错误结果信息. 如下是springBoot自带的错误结果信息: ...

  5. springboot中web应用的统一异常处理

    在web应用中,请求处理过程中发生异常是非常常见的情况.springboot为我们提供了一个默认的映射:/error,当处理中抛出异常之后,会转到该请求中处理,并且该请求有一个全局的错误页面用来展示异 ...

  6. SpringBoot入门系列(十一)统一异常处理的实现

    前面介绍了Spring Boot 如何整合定时任务已经Spring Boot 如何创建异步任务和定时任务.不清楚的朋友可以看看之前的文章:<Spring Boot 入门系列文章> 接下来主 ...

  7. SpringBoot系列(十)优雅的处理统一异常处理与统一结果返回

    SpringBoot系列(十)统一异常处理与统一结果返回 往期推荐 SpringBoot系列(一)idea新建Springboot项目 SpringBoot系列(二)入门知识 springBoot系列 ...

  8. Java 项目创建 -- 统一结果处理、统一异常处理、统一日志处理

    一.IDEA 插件使用 1.说明 此处使用 SpringBoot 2.2.6 .JDK 1.8 .mysql 8.0.18 作为演示. 使用 IDEA 作为开发工具. 2.IDEA 插件 -- Lom ...

  9. SpringBoot系列——自定义统一异常处理

    前言 springboot内置的/error错误页面并不一定适用我们的项目,这时候就需要进行自定义统一异常处理,本文记录springboot进行自定义统一异常处理. 1.使用@ControllerAd ...

随机推荐

  1. Nginx搭建简单文件下载服务器

    在C:\pleiades\nginx-1.16.1下新建一个目录files,然后放入若干文件,接下来修改nginx.conf,增加粗体字如下: #user nobody; worker_process ...

  2. 常见的 35 个 Python 面试题及答案

    1. Python 面试问题及答案 作为一个 Python 新手,你必须熟悉基础知识.在本文中我们将讨论一些 Python 面试的基础问题和高级问题以及答案,以帮助你完成面试.包括 Python 开发 ...

  3. python操作excel——openpyxl

    一.概述 python操作excel各个库对比:https://www.cnblogs.com/paul-liang/p/9187503.html 官方文档:https://openpyxl.read ...

  4. openstack 权限控制 (添加自定义角色)keystone等组件

    每一个平台.系统都会对于用户的权限进行严格的管理与控制. openstack是一个开源的项目,我们可以直接下载其源码,进行更改以达到我们的要求. 这里只是针对于用户的权限进行管理,以keystone: ...

  5. java中的Stream流

    java中的Stream流 说到Stream便容易想到I/O Stream,而实际上,谁规定"流"就一定是"IO流"呢?在Java 8中,得益于Lambda所带 ...

  6. mysql 的日期和时间函数

    执行函数方式 select 函数  函数名称 函   数 功   能 CURDATE() 获取当前日期 CURTIME() 获取当前时间 NOW() 获取当前的日期和时间 UNIX_TIMESTAMP ...

  7. LeetCode 223. 矩形面积(Rectangle Area)

    223. 矩形面积 223. Rectangle Area 题目描述 在二维平面上计算出两个由直线构成的矩形重叠后形成的总面积. 每个矩形由其左下顶点和右上顶点坐标表示,如图所示. LeetCode2 ...

  8. LeetCode 227. 基本计算器 II(Basic Calculator II)

    227. 基本计算器 II 227. Basic Calculator II 题目描述 实现一个基本的计算器来计算一个简单的字符串表达式的值. 字符串表达式仅包含非负整数,+,-,*,/ 四种运算符和 ...

  9. 使用JMeter进行Apache Kafka负载测试

    1.卡夫卡负载测试 在这个Apache Kafka教程中,我们将了解如何使用Apache JMeter,如何在Apache Kafka上执行Kafka负载测试.此外,这个Kafka负载测试教程教我们如 ...

  10. python 之网络编程(基于TCP协议Socket通信的粘包问题及解决)

    8.4 粘包问题 粘包问题发生的原因: 1.发送端需要等缓冲区满才发送出去,造成粘包(发送数据时间间隔很短,数据了很小,会合到一起,产生粘包),这样接收端,就难于分辨出来了,必须提供科学的拆包机制. ...