介绍

  • 项目中全局异常是个很好的东西,但是很多时候都忘记设置(我的初级成长过程)
  • 注意本模块已经用了接口返回的格式,可以自定义返回格式(JSON)
  • 满足了以下功能
    • 拦截项目中的所有异常进行指定的格式输出
    • 自定义异常,满足当没项目的不同的异常编码
    • 针对一些异常消息的不规范进行格式化处理
      • BindException
      • MethodArgumentNotValidException
      • HttpMessageNotReadableException

        引入依赖

        1. <dependency>
        2. <groupId>cn.jdevelops</groupId>
        3. <artifactId>apis-exception</artifactId>
        4. <version>2.0.2</version>
        5. </dependency>

        使用

        没有任何配置,引入依赖即可

错误示范

  1. /**
  2. * 测试全局异常拦截处理
  3. * @return ResultVO
  4. */
  5. @GetMapping("/testGlobalErrors")
  6. public ResultVO<Integer> testGlobalErrors(){
  7. Integer i = 1/0;
  8. return ResultVO.success(i, "测试全局异常拦截处理");
  9. }
  10. /**
  11. * 测试全局异常拦截处理
  12. * @return ResultVO
  13. */
  14. @GetMapping("/testGlobalTry")
  15. public ResultVO<Integer> testGlobalTry(){
  16. throw new BusinessException("测试全局异常拦截处理");
  17. }

image.png

自定义返回的数据格式

参考Shenyu - 自定义返回结果

  • 全局异常统一的返回格式,如果需要自己定义格式,可以进行扩展。

    默认实现

  • 默认的实现为 cn.jdevelops.exception.result.DefaultExceptionResult

  • 返回的数据格式如下 ```java package cn.jdevelops.result.result;

import cn.jdevelops.enums.result.ResultCodeEnum; import cn.jdevelops.result.page.ResourcePage; import com.fasterxml.jackson.annotation.JsonInclude; import com.yomahub.tlog.context.TLogContext; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Getter; import lombok.Setter; import lombok.ToString; import org.apache.commons.lang3.StringUtils; import org.apache.skywalking.apm.toolkit.trace.TraceContext;

import java.io.Serializable;

/**

  • 全局结果集 *
  • @author tn
  • @version 1
  • @date 2020/6/8 17:28 */ @Getter @Setter @ToString @ApiModel(value = “返回结果集”, description = “全局返回对象”) public class ResultVO implements Serializable {

    private static final long serialVersionUID = -7719394736046024902L;

    /**

    • 返回结果状态码 */ @ApiModelProperty(value = “返回结果状态码”) private Integer code;

      /**

    • 返回消息 */ @ApiModelProperty(value = “返回消息”) private String message;

      /**

    • 数据 */ @ApiModelProperty(value = “数据”) private T data;

      /**

    • 时间戳 */ @ApiModelProperty(value = “时间戳”) private Long ts = System.currentTimeMillis();

      /**

    • traceId */ @ApiModelProperty(value = “skywalking_traceId”) @JsonInclude(JsonInclude.Include.NON_EMPTY) private String traceId;

}

  1. - 返回的 json 格式如下
  2. ```json
  3. {
  4. "code": 10000,
  5. "message": "测试全局异常拦截处理",
  6. "data": null,
  7. "ts": 1639114482236,
  8. "traceId": "9708403571429440",
  9. "success": false
  10. }

扩展(自定义)

  • 新增一个类CustomResult 实现 cn.jdevelops.exception.result.ExceptionResult ```java package cn.tannn.globalexception.result;

import cn.jdevelops.exception.result.ExceptionResult; import org.springframework.stereotype.Component;

/**

  • 自定义返回包装类
  • @author tn
  • @date 2021-01-20 10:50 */ @Component(“exceptionResult”) // 跟 @Bean二选一 public class CustomResult implements ExceptionResult { @Override public ReplaceResultVO success(int code, String message, Object object) {

    1. return ReplaceResultVO.success(code,message);

    }

    @Override public ReplaceResultVO error(int code, String message, Object object) {

    1. return ReplaceResultVO.fail(code, message, object);

    }

    @Override public ReplaceResultVO error(int code, String message) {

    1. return ReplaceResultVO.fail(code, message);

    } }

/**

  • ReplaceResultVO */ @Getter @Setter @ToString public class ReplaceResultVO implements Serializable {

    private static final long serialVersionUID = -7719394736046024902L;

    /**

    • 返回结果状态码 */ private Integer zhuangTaiMa;

    /**

    • 返回消息 */ private String xiaoXi;

    /**

    • 数据 */ private T sJu;

    public static ReplaceResultVO success(int code, String message) {

    1. ReplaceResultVO<T> resultVO = new ReplaceResultVO<>();
    2. resultVO.setZhuangTaiMa(code);
    3. resultVO.setXiaoXi(message);
    4. return resultVO;

    }

    public static ReplaceResultVO fail(int code, String message, T data) {

    1. ReplaceResultVO<T> resultVO = new ReplaceResultVO<>();
    2. resultVO.setZhuangTaiMa(code);
    3. resultVO.setXiaoXi(message);
    4. resultVO.setSJu(data);
    5. return resultVO;

    }

    public static ReplaceResultVO fail(int code, String message) {

    1. ReplaceResultVO<T> resultVO = new ReplaceResultVO<>();
    2. resultVO.setZhuangTaiMa(code);
    3. resultVO.setXiaoXi(message);
    4. return resultVO;

    } }

  1. - 其中泛型 T 为自定义的数据格式,返回它就好。
  2. - 把你新增的实现类注册成为Springbean,如下:
  3. > **bean名一定要注意: === ExceptionResult or exceptionResult**
  4. - 方法一 springboot启动类中加入
  5. ```java
  6. @Bean
  7. public ExceptionResult customResult() {
  8. return new CustomResult();
  9. }
  • 方法二 直接使用 @Component("exceptionResult") 注解

    其他功能

    定制自己项目中的 BusinessException 和 ResultCodeEnum

    ```java /**当前的异常类 继承 BusinessException **/

package com.database.approval.config;

import com.database.approval.enums.ApprovalExceptionEnum; import com.databstech.apis.resultexception.exception.BusinessException;

/**

  • @author tn
  • @ClassName ApprovalException
  • @description 当前的异常类 继承 BusinessException
  • @date 2021-01-05 15:00 */ public class ApprovalException extends BusinessException {

    public ApprovalException(int code, String message) {

    1. super(code, message);

    }

    public ApprovalException(String message) {

    1. super(message);

    }

    // 构建自己的 ResultCodeEnum public ApprovalException(ApprovalExceptionEnum approvalExceptionEnum) {

    1. super(approvalExceptionEnum.getCode(), approvalExceptionEnum.getMessage());

    } }

/* 构建自己的 ResultCodeEnum */

package com.database.approval.enums;

import lombok.AllArgsConstructor; import lombok.Getter;

/**

  • 构建自己的 ResultCodeEnum
  • @author tn
  • @ClassName ApprovalExceptionEnum
  • @description 当前类的错误返回集
  • @date 2021-01-05 15:03 */ @AllArgsConstructor @Getter public enum ApprovalExceptionEnum {

    NOW_NODE_NOT_CONTINUE_APPROVAL(40012, “当前节点不能进行继续申报操作”), ERROR_CONTINUE_APPROVAL(40013, “继续申报操作异常”), OPERATION_FAILURE_APPROVAL(40014, “操作失败!”), IS_ONE_NODE_APPROVAL(40014, “操作失败:当前节点是第一节点,无法驳回重审!”), ;

    private Integer code; private String message; }

```

示例项目地址

https://github.com/en-o/Jdevelops-Example/tree/main/GlobalException