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