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. cesium常用设置【转】

    https://blog.csdn.net/D_Walker/article/details/82188514 1.加载线上cesium代码<link href="http://ces ...

  2. Android系统如何移植wpa_supplicant及wifi驱动

    一.WPA_SUPPLICANT简介 1. 什么是wpa_supplicant wpa_supplicant is a WPA Supplicant for Linux, BSD, Mac OS X, ...

  3. oracle 19c jdbc之Reactive Streams Ingestion (RSI) Library

    19c jdbc新特性 https://blogs.oracle.com/dev2dev/whats-new-in-193-and-183-jdbc-and-ucp jdbc实现直接路径加载 http ...

  4. Java基础 throw 抛出异常后,用try...catch捕获

        JDK :OpenJDK-11      OS :CentOS 7.6.1810      IDE :Eclipse 2019‑03 typesetting :Markdown   code ...

  5. 微信小程序 自定义tabbar实例

    在小程序的开发文档中,对tabbar是这样说明的: 如果小程序是一个多 tab 应用(客户端窗口的底部或顶部有 tab 栏可以切换页面),可以通过 tabBar 配置项指定 tab 栏的表现,以及 t ...

  6. django项目模型字段

    一个模型(model)就是一个单独的.确定的数据的信息源,包含了数据的字段和操作方法.通常,每个模型映射为一张数据库中的表. 基本的原则如下: 每个模型在Django中的存在形式为一个Python类 ...

  7. 如何在自己的MacBook上体验OpenShift 4.1

    在4版本后,CDK和minishift基本不跟新了,取代的是一个CodeReady Containter,定位和CDK以及minishift一样,简称CRC,是在本地环境中运行一个开发环境,目前仍然是 ...

  8. tomcat一闪而过,无法开启

    记事本打开startup.bat,找到最后一句话::end,我们知道end表示结束的意思,:end是一个标记,我们在后面加上一句pause,然后启动该脚本 正常情况下回像下图显示 如果一闪而过的话,可 ...

  9. Eclipse安装Properties Editor插件

    安装步骤 1.打开eclispe编辑器help-->install new soft 2.输入软件地址 name:properties editor Location:http://proped ...

  10. mongoDB杂项

    密码更改:db.changeUserPassword('tank2','test'); 在这里我遇到了一个问题: mongod: error while loading shared librarie ...