基础格式的封装
这段代码定义了一个通用的API响应结果封装类Result,主要作用是:
- 统一接口返回格式:所有接口都返回相同结构的结果对象
- 包含三个核心属性:
- code:状态码(1表示成功,0表示失败)
- msg:错误信息描述
- data:实际返回的数据内容
- 提供三种静态工厂方法:
- 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;
}
}当调用时没有指定泛型类型时,会发生以下情况:
-
类型擦除:Java会在编译时将未指定的泛型类型视为Object类型处理
-
示例对比:
// 指定泛型类型
Result<String> result1 = Result.success("data");
// 未指定泛型类型,相当于使用原始类型
Result result2 = Result.success("data");
// 等价于 Result<Object> result2 = Result.success("data");-
影响:
- 编译器不会进行类型检查,失去泛型的安全性
- 获取data时需要进行强制类型转换
- 可能出现ClassCastException运行时异常
- 代码可读性和维护性下降
-
建议:始终指定泛型类型以确保类型安全和代码清晰度。
全局异常的处理
当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());
}
}