Graceful Response 构建 Spring Boot 响应处理的方法

 更新时间:2024年01月25日 11:11:13   作者:小毕超  
Graceful Response是一个Spring Boot技术栈下的优雅响应处理器,提供一站式统一返回值封装、全局异常处理、自定义异常错误码等功能,本文介绍Graceful Response 构建 Spring Boot 下优雅的响应处理,感兴趣的朋友一起看看吧

一、Graceful Response

Graceful Response 是一个 Spring Boot 技术栈下的优雅响应处理器,提供一站式统一返回值封装、全局异常处理、自定义异常错误码等功能,使用Graceful Response进行web接口开发不仅可以节省大量的时间,还可以提高代码质量,使代码逻辑更清晰。

github地址:https://github.com/feiniaojin/graceful-response

对应 SpringBoot 版本

Spring Boot版本Graceful Response版本graceful-response-example分支
2.x3.4.0-boot23.4.0-boot2
3.x3.4.0-boot33.4.0-boot3

二、快速使用

引入依赖:

<dependency>
    <groupId>com.feiniaojin</groupId>
    <artifactId>graceful-response</artifactId>
    <version>3.4.0-boot2</version>
</dependency>

启动类增加注解:

@EnableGracefulResponse

声明测试接口:

@Slf4j
@RestController
@RequestMapping("/test")
public class TestController {
    /**
     * 返回对象形式
     */
    @GetMapping("/t1")
    public Map<String, String> t1() {
        //具体逻辑
        return Collections.singletonMap("status","abc");
    }
    /**
     * Command 形式
     */
    @GetMapping("/t2")
    public void t2() {
        // 具体逻辑
    }
}

测试 /test/t1 接口:

测试 /test/t2 接口:

三、返回格式调整

Graceful Response 内置了两种风格的返回,可以通过修改 graceful-response.response-style 进行切换,分别是:

默认格式:

graceful-response:
  response-style: 0

第二种模式:

{
  "status": {
    "code": 200,
    "msg": "success"
  },
  "payload": {
  }
}

格式如下:

{
  "code": "200",
  "msg": "success",
  "data": {
  }
}

如果需要自定义返回格式则需要实现 Response 接口,并在配置中通过graceful-response.response-class-full-name 进行指定,例如:

@Data
public class CustomResponse implements Response {

    private String code;

    private Long timestamp = System.currentTimeMillis();

    private String message;

    private Object data = Collections.EMPTY_MAP;

    @Override
    public void setStatus(ResponseStatus statusLine) {
        this.code = statusLine.getCode();
        this.message = statusLine.getMsg();
    }

    @Override
    @JsonIgnore
    public ResponseStatus getStatus() {
        return null;
    }

    @Override
    public void setPayload(Object payload) {
        this.data = payload;
    }

    @Override
    @JsonIgnore
    public Object getPayload() {
        return null;
    }
}

然后在配置文件中声明:

graceful-response:
  response-class-full-name: com.bxc.retrydemo.handler.CustomResponse

再次访问上面的测试接口:

四、自定义异常和错误码

当抛出异常时我们希望根据不同的异常返回不同的错误码,在 Graceful Response 中为我们提供了 @ExceptionMapper 注解,可以快速的指定返回的错误码和提示。

例如:

@ExceptionMapper(code = "1003", msg = "自定义异常", msgReplaceable = true)
public class MyException extends RuntimeException {
    public MyException() {
        super();
    }
    public MyException(String message) {
        super(message);
    }
    public MyException(String message, Throwable cause) {
        super(message, cause);
    }
    public MyException(Throwable cause) {
        super(cause);
    }
    public MyException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
        super(message, cause, enableSuppression, writableStackTrace);
    }
}

测试接口修改:

@Slf4j
@RestController
@RequestMapping("/test")
public class TestController {
    /**
     * 返回对象形式
     */
    @GetMapping("/t1")
    public Map<String, String> t1(Integer a) {
        //具体逻辑
        // ....
        // 抛出异常
        if (a == 0){
            throw new MyException();
        }
        return Collections.singletonMap("status","abc");
    }
    /**
     * Command 形式
     */
    @GetMapping("/t2")
    public void t2(Integer a) {
        //具体逻辑
        // ....
        // 抛出异常
        if (a == 0){
            throw new MyException("t2 接口执行异常");
        }
    }
}

测试 /test/t1 接口:

测试 /test/t2 接口:

五、参数校验异常错误码

有的时候我们需要校验某个参数是否合法,当在不同情况下需要返回不同的错误码,在 Graceful Response 中对JSR-303数据校验规范和Hibernate Validator进行了增强,Graceful Response自身不提供参数校验的功能,但是用户使用了Hibernate Validator后,Graceful Response可以通过@ValidationStatusCode注解为参数校验结果提供响应码,并将其统一封装返回。

例如:

@Data
public class TestDTO {
    @NotNull(message = "name 不可为空")
    @Length(min = 1, max = 5, message = "name 的长度在 1-5 之间")
    @ValidationStatusCode(code = "1003")
    private String name;
    @NotNull(message = "age 不可为空")
    @Min(value = 0,message = "age 不可小于 0 ")
    @ValidationStatusCode(code = "1004")
    private Integer age;
}

声明测试接口:

@Slf4j
@RestController
@RequestMapping("/test")
public class TestController {
    @PostMapping("/t3")
    public void t3(@Validated TestDTO dto) {
        //具体逻辑
        // ....
    }
}

测试 /test/t3 接口:

六、手动抛出指定状态码和信息

Graceful Response 提供了 GracefulResponse 通用工具类,在需要抛出GracefulResponseException时,只需要调用raiseException方法即可。

例如:

@Slf4j
@RestController
@RequestMapping("/test")
public class TestController {
    /**
     * 返回对象形式
     */
    @GetMapping("/t1")
    public Map<String, String> t1(Integer a) {
        //具体逻辑
        // ....
        // 抛出异常
        if (a == 0) {
            GracefulResponse.raiseException("1065", "自定义抛出异常");
        }
        return Collections.singletonMap("status", "abc");
    }
}

测试 /test/t1 接口:

七、例外请求放行

Graceful Response 会对所有的 controller 方法处理,如果希望跳过自定处理返回可以可以添加 @ExcludeFromGracefulResponse注解:

例如:

@Slf4j
@RestController
@RequestMapping("/test")
public class TestController {
    /**
     * 返回对象形式
     */
    @GetMapping("/t1")
    @ExcludeFromGracefulResponse
    public Map<String, String> t1(Integer a) {
        //具体逻辑
        // ....
        return Collections.singletonMap("status", "abc");
    }
}

也可以根据包名进行排除,例如:

graceful-response:
  exclude-packages:
    - springfox.**
graceful-response:
  exclude-packages:
    - org.springframework.boot.actuate.*

八、常用配置

graceful-response:
  # 自定义Response类的全限定名,默认为空。 
  # 配置response-class-full-name后,response-style将不再生效
  response-class-full-name:
  # 是否打印异常日志,默认为false
  print-exception-in-global-advice: false
  # Response风格,不配置默认为0
  response-style: 0
  # 自定义的成功响应码,不配置则为0
  default-success-code: 0
  # 自定义的成功提示,默认为ok
  default-success-msg: ok
  # 自定义的失败响应码,默认为1
  default-error-code: 1
  # 自定义的失败提示,默认为error
  default-error-msg: error
  # 全局的参数校验错误码,默认等于default-error-code
  default-validate-error-code:
  # 例外包路径(支持数字, *和**通配符匹配),该包路径下的controller将被忽略处理
  exclude-packages:
    - com.lizhiadmin.pro.module.*.controller
  # 设置是否将原生异常错误信息detailMessage字段填充到Response的msg中
  # 默认为false,即不打开
  origin-exception-using-detail-message: false

到此这篇关于Graceful Response 构建 Spring Boot 下优雅的响应处理的文章就介绍到这了,更多相关Spring Boot 响应处理内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Spring Mvc下实现以文件流方式下载文件的方法示例

    Spring Mvc下实现以文件流方式下载文件的方法示例

    这篇文章主要介绍了Spring Mvc下实现以文件流方式下载文件的方法示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-05-05
  • Windows安装Maven并配置环境的详细步骤

    Windows安装Maven并配置环境的详细步骤

    Maven是一个非常流行的构建和项目管理工具,用于Java开发,它提供了一个强大的依赖管理系统和一系列标准化的构建生命周期,本文将指导您如何在Windows操作系统上安装和配置Maven,需要的朋友可以参考下
    2023-05-05
  • Java线程池双雄之ForkJoinPool和ThreadPoolExecutor的区别详解

    Java线程池双雄之ForkJoinPool和ThreadPoolExecutor的区别详解

    Java线程池是多线程编程中的一个重要概念,主要用于管理和复用线程资源,避免频繁创建和销毁线程带来的性能开销,这篇文章主要介绍了Java线程池双雄之ForkJoinPool和ThreadPoolExecutor区别的相关资料,需要的朋友可以参考下
    2026-04-04
  • 一文带你彻底搞懂Lambda表达式

    一文带你彻底搞懂Lambda表达式

    这篇文章主要介绍了一文带你彻底搞懂Lambda表达式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-09-09
  • 基于Java文件输入输出流实现文件上传下载功能

    基于Java文件输入输出流实现文件上传下载功能

    这篇文章主要为大家详细介绍了基于Java文件输入输出流实现文件上传下载功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-04-04
  • 基于SpringBoot框架实现文件上传下载分享功能

    基于SpringBoot框架实现文件上传下载分享功能

    在当今的Web应用开发中,文件上传与下载功能是极为常见且重要的需求,无论是用户上传头像、分享文档,还是系统生成报告供用户下载,都离不开这一功能模块,SpringBoot作为一款流行的Java开发框架,为我们提供了简洁高效的方式来实现文件上传与下载,需要的朋友可以参考下
    2025-06-06
  • Mybatis-Plus中updateById方法不能更新空值问题解决

    Mybatis-Plus中updateById方法不能更新空值问题解决

    本文主要介绍了Mybatis-Plus中updateById方法不能更新空值问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-08-08
  • 深入浅出Java中的Happens-Before核心规则

    深入浅出Java中的Happens-Before核心规则

    本文解析Java内存模型中的Happens-Before原则,解释其定义、核心规则及实际应用,帮助理解多线程可见性与有序性问题,掌握并发编程关键,感兴趣的朋友跟随小编一起看看吧
    2025-09-09
  • JAVA删除字符串固定下标字串的实现

    JAVA删除字符串固定下标字串的实现

    本文主要介绍了JAVA删除字符串固定下标字串的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-04-04
  • Nacos的单机模式启动失败问题及解决

    Nacos的单机模式启动失败问题及解决

    这篇文章主要介绍了Nacos的单机模式启动失败问题及解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-07-07

最新评论