当前位置: 首页 > news >正文

springBoot统一响应类型3.3版本

前言:

通过实践而发现真理,又通过实践而证实真理和发展真理。从感性认识而能动地发展到理性认识,又从理性认识而能动地指导革命实践,改造主观世界和客观世界。实践、认识、再实践、再认识,这种形式,循环往复以至无穷,而实践和认识之每一循环的内容,都比较地进到了高一级的程度。

上期回顾:

1:@ControllerAdvice提供了对全局统一响应支持

2:supports与beforBodyWrite关系,用一个三元运算符表示,supports ? beforBodyWrite :异常

3:supports只影响同一文件下的beforeBodyWrite

本期将进入到全局异常中

先创建一个类,我称其为异常统一类

第一点的:HTTP 状态码 | 菜鸟教程

第二点的:异常信息

继承RuntimeException,自动捕获运行时的异常

@Data
@AllArgsConstructor
public class BusinessException extends RuntimeException {


    /**
     * 异常编码
     * 异常信息
     */
    private int code;
    private String massage;

    /**
     * 无参构造函数
     */
    public BusinessException() {
        super();
    }
}

随着实践的加深

作者 对统一响应进行了更具体的细分

统一响应:成功响应和异常响应

根据它们传入的参数,又可以具体分为三种:

        第一种:基本响应        

        第二种:自定义信息响应

        第三种:完全自定义响应

对应形参

第一种:data

第二种:message、data

第三种:code、message、data

有些b人就是喜欢搞一些多余编码code,美名其曰专业化,之前的版本只有自定义消息,没做自定义编码,所以不适用了

public class apiResultYOUYA {

    /**
     * 默认成功HTTP状态码 (200 OK)
     */
    private static final int OK = HttpStatus.OK.value();

    /**
     * 默认错误HTTP状态码 (500 Internal Server Error)
     */
    private static int NO = HttpStatus.INTERNAL_SERVER_ERROR.value();

    /**
     *  基本响应
     *
     * @param data 响应数据
     * @param <T> 响应数据类型
     * @return
     */
    public static <T> apiResult<T> success(T data) {
        return new apiResult<>(OK, "操作成功", data);
    }

    /**
     *  自定义信息统一响应
     * @param message 自定义提示信息
     * @param data 响应数据
     * @return
     * @param <T> 响应数据类型
     */
    public static <T> apiResult<T> success(String message, T data) {
        return new apiResult<>(OK, message, data);
    }

    /**
     *  完全自定义统一响应
     * @param code  自定义提示编码
     * @param message 自定义提示信息
     * @param data  响应数据
     * @return
     * @param <T>   响应数据类型
     */
    public static <T> apiResult<T> success(int code, String message, T data) {
        return new apiResult<>(code, message, data);
    }

    /**
     *  基本失败响应
     * @return
     * @param <T> 响应数据类型
     */
    public static <T> apiResult<T> error() {
        return new apiResult<>(NO, "系统错误,请联系管理员");
    }

    /**
     *  自定义信息统一失败响应
     * @param message 自定义提示信息
     * @return
     * @param <T> 响应数据类型
     */
    public static <T> apiResult<T> error(String message) {
        return new apiResult<>(NO, message);
    }

    /**
     *  完全自定义统一失败响应
     * @param code  自定义编码
     * @param message 自定义提示信息
     * @return
     * @param <T> 响应数据类型
     */
    public static <T> apiResult<T> error(int code, String message) {
        return new apiResult<>(code, message);
    }

}

统一异常类处理

@Slf4j
@RestControllerAdvice
public class GlobalExcResult {

    @ExceptionHandler(Throwable.class)
    public apiResult handleException(Throwable throwable){

        if (throwable instanceof BusinessException businessException){
            log.info("请求出现业务异常:",throwable);
            return apiResultYOUYA.error(businessException.getMessage());
        }
        log.error("请求出现系统异常:",throwable);
        return apiResultYOUYA.error("服务器内部错误");
    }
}

运行

控制台打印报错是因为这两句

log.error("请求出现系统异常:",throwable);

log.info("请求出现业务异常:",throwable);

这响应内容是包含在data里的,重复了

在统一响应中打上断点,查看body

        if (body instanceof apiResult){
            return (apiResult)body;
        }

将它们转换成apiresult

相关文章:

  • 4、网工软考—VLAN配置—hybird配置
  • 以科技赋能,炫我云渲染受邀参加中关村文化科技融合影视精品创作研讨会!
  • 《白帽子讲 Web 安全》之跨站请求伪造
  • 剑指Offer44 -- 思维
  • Java Synchronized底层原理:Monitor机制、锁膨胀、自旋优化与偏向锁细节解密
  • vcpkg安装指定版本的库
  • 重磅推出稳联技术Profinet转CANopen网关智能工厂解决方案!
  • 磷酸铁锂电池自动分选机:新能源产业的智能新宠
  • 深入理解机器学习之TF-IDF:文本特征提取的核心技术
  • STM32 时钟树配置(debug)
  • Citus源码(1)分布式表行为测试
  • 自动化测试与 CAPTCHA 识别指南
  • notepad++ 正则表达式
  • Python第六章16:字典(dict)的常用操作
  • 如何为 Debian 和 Kali 系统更换软件源并更新系统
  • transform 3d学习简单示例
  • Mysql-DML
  • 基于dify平台批量分析excel格式信息
  • Android 12系统源码_系统启动(三)SystemServer进程
  • 启山智软实现b2c单商户商城对比传统单商户的优势在哪里?
  • 4月22城新房价格上涨:上海一二手房价环比均上涨,核心城市土地热带动市场热度提升
  • 上海发文加强直播经济技能人才培养:三年新培养持证直播技能人才5万名
  • AG600“鲲龙”批生产首架机完成生产试飞
  • 公示资费套餐、规范营销行为,今年信息通信行业将办好这十件实事
  • 科普|认识谵妄:它有哪些表现?患者怎样走出“迷雾”?
  • 媒体:“重病老人银行取款身亡”涉事家属称已和解,银行将支付十万