基础格式的封装

这段代码定义了一个通用的API响应结果封装类Result,主要作用是:

  1. 统一接口返回格式:所有接口都返回相同结构的结果对象
  2. 包含三个核心属性:
    • code:状态码(1表示成功,0表示失败)
    • msg:错误信息描述
    • data:实际返回的数据内容
  3. 提供三种静态工厂方法:
    • success():构建成功的空结果
    • success(T object):构建包含数据的成功结果
    • error(String msg):构建包含错误信息的失败结果

通过泛型支持不同类型的数据返回,实现了前后端交互数据格式的标准化。

@Data
public class Result<T> implements Serializable {
 
    private Integer code; //编码:1成功,0和其它数字为失败
    private String msg; //错误信息
    private T data; //数据
 
    public static <T> Result<T> success() {
        Result<T> result = new Result<T>();
        result.code = 1;
        return result;
    }
 
    public static <T> Result<T> success(T object) {
        Result<T> result = new Result<T>();
        result.data = object;
        result.code = 1;
        return result;
    }
 
    public static <T> Result<T> error(String msg) {
        Result result = new Result();
        result.msg = msg;
        result.code = 0;
        return result;
    }
 
}

当调用时没有指定泛型类型时,会发生以下情况:

  1. 类型擦除:Java会在编译时将未指定的泛型类型视为Object类型处理

  2. 示例对比

// 指定泛型类型
Result<String> result1 = Result.success("data");
 
// 未指定泛型类型,相当于使用原始类型
Result result2 = Result.success("data");
// 等价于 Result<Object> result2 = Result.success("data");
  1. 影响

    • 编译器不会进行类型检查,失去泛型的安全性
    • 获取data时需要进行强制类型转换
    • 可能出现ClassCastException运行时异常
    • 代码可读性和维护性下降
  2. 建议:始终指定泛型类型以确保类型安全和代码清晰度。

全局异常的处理

当service层抛出异常时,会被全局异常处理器捕获并转换为统一的JSON格式返回给前端。

package com.sky.handler;
 
/**
 * 全局异常处理器,处理项目中抛出的业务异常
 */
@RestControllerAdvice
@Slf4j
public class GlobalExceptionHandler {
 
    /**
     * 捕获业务异常
     * @param ex
     * @return
     */
    @ExceptionHandler
    public Result exceptionHandler(BaseException ex){
        log.error("异常信息:{}", ex.getMessage());
        return Result.error(ex.getMessage());
    }
 
}