SpringBoot异常处理统一封装我来作-使用篇

SpringBoot异常处理统一封装我来作-使用篇

简介

重复功能我来写。在 SpringBoot 项目里都有全局异常处理以及返回包装等,返回前端是带上succcodemsgdata等字段。单个项目状况下很好解决,当微服务模块多的状况下,不少状况开发都是复制原有代码进行构建另一个项目的,致使这些功能升级须要修改多个服务,在这个基础上,咱们封装了一个组件 unified-dispose-springboot-starter 里面包含了一些基础的异常处理以及返回包装功能。前端

依赖添加启动功能

添加依赖ps: 实际version版本请使用最新版最新版本: ![Maven Central](https://search.maven.org/search?q=g:com.purgeteam%20AND%20a:unified-dispose-springboot-starter)git

点击查看最新新版本github

<dependency>
  <groupId>com.purgeteam</groupId>
  <artifactId>unified-dispose-springboot-starter</artifactId>
  <version>0.1.1.RELEASE</version>
</dependency>复制代码

启动类添加 @EnableGlobalDispose 注解开启如下功能。web

@EnableGlobalDispose
@SpringBootApplication
public class GlobalDisposeSpringBootApplication {

  public static void main(String[] args) {
    SpringApplication.run(GlobalDisposeSpringBootApplication.class, args);
  }

}复制代码

One 异常处理⚠️

在项目中常常出现系统异常的状况,好比NullPointerException等等。若是默认未处理的状况下,springboot会响应默认的错误提示,这样对用户体验不是友好,系统层面的错误,用户不能感知到,即便为500的错误,能够给用户提示一个相似服务器开小差的友好提示等。spring

模块里以及包含了一些基本的异常处理方式(及不须要作任何代码编写已经具备基本异常处理),以及一些常见的异常code,用户只须要关心业务异常处理便可,直接经过 throw new 异常 的方式抛出便可。springboot

异常处理包含类型

# 通用500异常
Exception 类捕获 500 异常处理

# Feign 异常
FeignException 类捕获
ClientException 类捕获

# 业务自定义
BusinessException 类捕获 业务通用自定义异常

# 参数校验异常
HttpMessageNotReadableException 参数错误异常
BindException 参数错误异常复制代码

程序主动抛出异常

throw new BusinessException(BusinessErrorCode.BUSINESS_ERROR);
// 或者
throw new BusinessException("CLOUD800","没有多余的库存");复制代码

一般不建议直接抛出通用的BusinessException异常,应当在对应的模块里添加对应的领域的异常处理类以及对应的枚举错误类型。服务器

如会员模块:建立UserException异常类、UserErrorCode枚举、以及UserExceptionHandler统一拦截类。微信

UserException:app

@Data
public class UserException extends RuntimeException {

  private String code;
  private boolean isShowMsg = true;

  /**
   * 使用枚举传参
   *
   * @param errorCode 异常枚举
   */
  public UserException(UserErrorCode errorCode) {
    super(errorCode.getMessage());
    this.setCode(errorCode.getCode());
  }

}复制代码

UserErrorCode:maven

@Getter
public enum UserErrorCode {
    /**
     * 权限异常
     */
    NOT_PERMISSIONS("CLOUD401","您没有操做权限"),
    ;

    private String code;

    private String message;

    CommonErrorCode(String code, String message) {
        this.code = code;
        this.message = message;
    }
}复制代码

UserExceptionHandler:

@Slf4j
@RestControllerAdvice
public class UserExceptionHandler {

  /**
   * UserException 类捕获
   */
  @ExceptionHandler(value = UserException.class)
  public Result handler(UserException e) {
    log.error(e.getMessage(), e);
    return Result.ofFail(e.getCode(), e.getMessage());
  }

}复制代码

最后业务使用以下:

// 判断是否有权限抛出异常
throw new UserException(UserErrorCode.NOT_PERMISSIONS);复制代码

上述方式,抛出异常后会被模块处理。前台返回以下

{
  "succ": false,        // 是否成功
  "ts": 1566467628851,  // 时间戳
  "data": null,         // 数据
  "code": "CLOUD800",   // 错误类型
  "msg": "业务异常",    // 错误描述
  "fail": true
}复制代码

Tow 统一返回封🗳

在REST风格的开发中,避免一般会告知前台返回是否成功以及状态码等信息。这里咱们一般返回的时候作一次util的包装处理工做,如:Result相似的类,里面包含succcodemsgdata等字段。

接口调用处理相似以下:

@GetMapping("hello")
  public Result list(){
    return Result.ofSuccess("hello");
  }复制代码

结果:

{
  "succ": ture,         // 是否成功
  "ts": 1566467628851,  // 时间戳
  "data": "hello",      // 数据
  "code": null,         // 错误类型
  "msg": null,          // 错误描述
  "fail": true
}复制代码

功能使用

默认状况全部的 web controller 都会被封装为一下返回格式。

接口:

@GetMapping("test")
public String test(){
  return "test";
}复制代码

返回

{
  "succ": true,             // 是否成功
  "ts": 1566386951005,      // 时间戳
  "data": "test",           // 数据
  "code": null,             // 错误类型
  "msg": null,              // 错误描述
  "fail": false             
}复制代码

忽略封装注解:@IgnorReponseAdvice

@IgnorReponseAdvice容许范围为:类 + 方法,标识在类上这个类下的说有方法的返回都将忽略返回封装。

接口:

@IgnorReponseAdvice // 忽略数据包装 可添加到类、方法上
@GetMapping("test")
public String test(){
  return "test";
}复制代码

返回 test

总结

项目里不少重复的code,咱们能够经过必定的方式去简化,以达到必定目的减小开发量。PurgeTeam 具备一些优秀的开源组件,减小平常的开发量。

示例代码地址:unified-dispose-springboot

做者GitHub:
Purgeyao 欢迎关注

qq交流群: 812321371 微信交流群: MercyYao

微信公众号:

微信公众号二维码

相关文章
相关标签/搜索