前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Spring boot 写一个异常处理组件

Spring boot 写一个异常处理组件

原创
作者头像
派大星在吗
发布2021-12-18 11:05:24
6860
发布2021-12-18 11:05:24
举报
文章被收录于专栏:我的技术专刊我的技术专刊

信息

基于 Spring Boot:2.3.8.RELEASE 构建

by:林同学(765371578@qq.com

Getting Started

引入依赖:

代码语言:txt
复制
<dependency>
代码语言:txt
复制
    <groupId>com.github.LinYuanBaoBao</groupId>
代码语言:txt
复制
    <artifactId>payload-spring-boot-starter</artifactId>
代码语言:txt
复制
    <version>1.0.2-RELEASE</version>
代码语言:txt
复制
</dependency>

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

代码语言:txt
复制
@Payload
代码语言:txt
复制
@RequestMapping("/users")
代码语言:txt
复制
@RestController
代码语言:txt
复制
public class MyController {
代码语言:txt
复制
    @GetMapping("/{id}")
代码语言:txt
复制
    public User get(@PathVariable Integer id) {
代码语言:txt
复制
        return user;
代码语言:txt
复制
    }
代码语言:txt
复制
}

响应结果格式如下:

代码语言:txt
复制
{
代码语言:txt
复制
  "code": 200,
代码语言:txt
复制
  "data": {
代码语言:txt
复制
    "k1": "v1",
代码语言:txt
复制
    "k2": "v2"
代码语言:txt
复制
  },
代码语言:txt
复制
  "success": true,
代码语言:txt
复制
  "message": "success",
代码语言:txt
复制
  "timestamp": 1623055152059
代码语言:txt
复制
}

配置

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

代码语言:txt
复制
spring:
代码语言:txt
复制
  mvc:
代码语言:txt
复制
    payload:
代码语言:txt
复制
      code: 200              # 成功状态码,默认:200
代码语言:txt
复制
      error-enabled: false    # 统一错误处理
代码语言:txt
复制
      enable-trace: false     # 打印堆栈信息
代码语言:txt
复制
      payload-map:
代码语言:txt
复制
        code: code
代码语言:txt
复制
        success: success
代码语言:txt
复制
        message: message
代码语言:txt
复制
        data: data
代码语言:txt
复制
        timestamp: timestamp
代码语言:txt
复制
        stack: stack
代码语言:txt
复制
        path: path
代码语言:txt
复制
      ding-ding-robot-config:
代码语言:txt
复制
        enable: false         # 是否启用钉钉告警机器人
代码语言:txt
复制
        webhook: https://...
代码语言:txt
复制
        secret: SEC...

异常处理

对于业务异常,建议继承 RuntimeException 类,并加上 @BizErrorResponseStatus 注解。 该注解还支持配置

status 属性定义 http-status 状态码,与 code 属性定义响应的 code 错误码。

代码语言:txt
复制
@BizErrorResponseStatus(code = 400,status = HttpStatus.BAD_REQUEST)
代码语言:txt
复制
public class CustomerException extends RuntimeException {
代码语言:txt
复制
   public CustomerException(String message){
代码语言:txt
复制
        super(message);
代码语言:txt
复制
   }
代码语言:txt
复制
}

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

代码语言:txt
复制
{
代码语言:txt
复制
    "success": false,
代码语言:txt
复制
    "message": "message",
代码语言:txt
复制
    "code": 400,
代码语言:txt
复制
    "timestamp": 1623055152059,
代码语言:txt
复制
    "path": "/app"
代码语言:txt
复制
}

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

  • isDealAttributes:是否对响应进行处理(默认为 true)
  • getErrorMessage:获取错误消息
代码语言:txt
复制
@Bean
代码语言:txt
复制
public ErrorDeal errorDeal() {
代码语言:txt
复制
    return new ErrorDeal() {
代码语言:txt
复制
        @Override
代码语言:txt
复制
        public Boolean isDealAttributes(WebRequest webRequest, ErrorAttributeOptions options) {
代码语言:txt
复制
            return true;
代码语言:txt
复制
        }
代码语言:txt
复制
        @Override
代码语言:txt
复制
        public String getErrorMessage(Map<String, Object> resultAttributes, Throwable error) {
代码语言:txt
复制
            String errorMsg = resultAttributes.get("error").toString();
代码语言:txt
复制
            if (error instanceof MethodArgumentNotValidException) {
代码语言:txt
复制
                return getMessage(((MethodArgumentNotValidException) error).getBindingResult().getAllErrors());
代码语言:txt
复制
            } else if (error instanceof BindException) {
代码语言:txt
复制
                return getMessage(((BindException) error).getAllErrors());
代码语言:txt
复制
            } else if (error instanceof ConversionFailedException) {
代码语言:txt
复制
                return error.getCause().getMessage();
代码语言:txt
复制
            }
代码语言:txt
复制
            return StringUtils.isEmpty(error.getMessage()) ? errorMsg : error.getMessage();
代码语言:txt
复制
        }
代码语言:txt
复制
    };
代码语言:txt
复制
}

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

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

时,会触发告警,内容如下:

代码语言:txt
复制
服务名称:${spring.application.name}
代码语言:txt
复制
报错日期:2021-06-09 18:16:07
代码语言:txt
复制
接口:/xx
代码语言:txt
复制
类路径:com.example.demo.controller.TestController
代码语言:txt
复制
异常方法:xx
代码语言:txt
复制
错误行数:29
代码语言:txt
复制
异常信息:禁用账号失败

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
作者已关闭评论
0 条评论
热度
最新
推荐阅读
目录
  • 信息
  • Getting Started
    • 配置
      • 异常处理
        • 代码异常告警(钉钉机器人)
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档