介绍
- 项目中全局异常是个很好的东西,但是很多时候都忘记设置(我的初级成长过程)
- 注意本模块已经用了接口返回的格式,可以自定义返回格式(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
@Bean
public 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