介绍
- 项目中全局异常是个很好的东西,但是很多时候都忘记设置(我的初级成长过程)
- 注意本模块已经用了接口返回的格式,可以自定义返回格式(JSON)
- 满足了以下功能
- 拦截项目中的所有异常进行指定的格式输出
- 自定义异常,满足当没项目的不同的异常编码
- 针对一些异常消息的不规范进行格式化处理
错误示范
/*** 测试全局异常拦截处理* @return ResultVO*/@GetMapping("/testGlobalErrors")public ResultVO<Integer> testGlobalErrors(){Integer i = 1/0;return ResultVO.success(i, "测试全局异常拦截处理");}/*** 测试全局异常拦截处理* @return ResultVO*/@GetMapping("/testGlobalTry")public ResultVO<Integer> testGlobalTry(){throw new BusinessException("测试全局异常拦截处理");}
自定义返回的数据格式
全局异常统一的返回格式,如果需要自己定义格式,可以进行扩展。
默认实现
默认的实现为
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;
}
- 返回的 json 格式如下```json{"code": 10000,"message": "测试全局异常拦截处理","data": null,"ts": 1639114482236,"traceId": "9708403571429440","success": false}
扩展(自定义)
- 新增一个类
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) { return ReplaceResultVO.success(code,message);
}
@Override public ReplaceResultVO error(int code, String message, Object object) {
return ReplaceResultVO.fail(code, message, object);
}
@Override public ReplaceResultVO error(int code, String message) {
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) { ReplaceResultVO<T> resultVO = new ReplaceResultVO<>();resultVO.setZhuangTaiMa(code);resultVO.setXiaoXi(message);return resultVO;
}
public static
ReplaceResultVO fail(int code, String message, T data) { ReplaceResultVO<T> resultVO = new ReplaceResultVO<>();resultVO.setZhuangTaiMa(code);resultVO.setXiaoXi(message);resultVO.setSJu(data);return resultVO;
}
public static
ReplaceResultVO fail(int code, String message) { ReplaceResultVO<T> resultVO = new ReplaceResultVO<>();resultVO.setZhuangTaiMa(code);resultVO.setXiaoXi(message);return resultVO;
} }
- 其中泛型 T 为自定义的数据格式,返回它就好。- 把你新增的实现类注册成为Spring的bean,如下:> **bean名一定要注意: === ExceptionResult or exceptionResult**- 方法一 springboot启动类中加入```java@Beanpublic ExceptionResult customResult() {return new CustomResult();}
- 方法二 直接使用
@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) {
super(code, message);
}
public ApprovalException(String message) {
super(message);
}
// 构建自己的 ResultCodeEnum public ApprovalException(ApprovalExceptionEnum approvalExceptionEnum) {
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
