美文网首页
一个 SpringBoot 统一响应体/异常处理组件(支持钉钉告

一个 SpringBoot 统一响应体/异常处理组件(支持钉钉告

作者: 聪明的奇瑞 | 来源:发表于2021-06-10 00:52 被阅读0次

payload-spring-boot-starter

一个 SpringBoot 统一响应体/异常处理组件。

信息

基于 Spring Boot:2.3.8.RELEASE 构建

by:林同学(765371578@qq.com

Getting Started

引入依赖:


<dependency>

    <groupId>com.github.LinYuanBaoBao</groupId>

    <artifactId>payload-spring-boot-starter</artifactId>

    <version>1.0.2-RELEASE</version>

</dependency>

Controller 上使用 @Payload 注解,自动对返回的数据进行包装。


@Payload

@RequestMapping("/users")

@RestController

public class MyController {


    @GetMapping("/{id}")

    public User get(@PathVariable Integer id) {

        return user;

    }

}


响应结果格式如下:


{

  "code": 200,

  "data": {

    "k1": "v1",

    "k2": "v2"

  },

  "success": true,

  "message": "success",

  "timestamp": 1623055152059

}

配置

见配置文件中 spring.mvc.payload 属性的自动提示


spring:

  mvc:

    payload:

      code: 200              # 成功状态码,默认:200

      error-enabled: false    # 统一错误处理

      enable-trace: false     # 打印堆栈信息

      payload-map:

        code: code

        success: success

        message: message

        data: data

        timestamp: timestamp

        stack: stack

        path: path

      ding-ding-robot-config:

        enable: false         # 是否启用钉钉告警机器人

        webhook: https://...

        secret: SEC...

异常处理

对于业务异常,建议继承 RuntimeException 类,并加上 @BizErrorResponseStatus 注解。 该注解还支持配置 status 属性定义 http-status 状态码,与 code 属性定义响应的 code 错误码。


@BizErrorResponseStatus(code = 400,status = HttpStatus.BAD_REQUEST)

public class CustomerException extends RuntimeException {

   public CustomerException(String message){

        super(message);

   }

}

当抛出上面异常时,HTTP 响应报文 http-status 状态码为 400,内容如下:


{

    "success": false,

    "message": "message",

    "code": 400,

    "timestamp": 1623055152059,

    "path": "/app"

}

抛出异常时,默认 message 信息为异常描述信息,你也可以自定义异常信息的获取方式,如:

  • isDealAttributes:是否对响应进行处理(默认为 true)

  • getErrorMessage:获取错误消息

@Bean
public ErrorDeal errorDeal() {
    return new ErrorDeal() {
        @Override
        public Boolean isDealAttributes(WebRequest webRequest, ErrorAttributeOptions options) {
            return true;
        }

        @Override
        public String getErrorMessage(Map<String, Object> resultAttributes, Throwable error) {
            String errorMsg = resultAttributes.get("error").toString();
            if (error instanceof MethodArgumentNotValidException) {
                return getMessage(((MethodArgumentNotValidException) error).getBindingResult().getAllErrors());
            } else if (error instanceof BindException) {
                return getMessage(((BindException) error).getAllErrors());
            } else if (error instanceof ConversionFailedException) {
                return error.getCause().getMessage();
            }
            return StringUtils.isEmpty(error.getMessage()) ? errorMsg : error.getMessage();
        }
    };
}

代码异常告警(钉钉机器人)

若启用了钉钉机器人告警,当异常(未使用 @BizErrorResponseStatus 注解)产生的响应 http-status 状态码 >= 500 时,会触发告警,内容如下:


服务名称:${spring.application.name}

报错日期:2021-06-09 18:16:07

接口:/xx

类路径:com.example.demo.controller.TestController

异常方法:xx

错误行数:29

异常信息:禁用账号失败

相关文章

网友评论

      本文标题:一个 SpringBoot 统一响应体/异常处理组件(支持钉钉告

      本文链接:https://www.haomeiwen.com/subject/mfayeltx.html