网站制作前景怎么样,logo制作软件免费版,太原网页设计与制作,腾讯微博 wordpress⛰️个人主页: 蒾酒
#x1f525;系列专栏#xff1a;《spring boot实战》
#x1f30a;山高路远#xff0c;行路漫漫#xff0c;终有归途。 目录
前置条件
封装目的
常用格式
定义返回结果枚举类
定义返回结果封装类
对返回结果封装
测试封装 前置条件
已…
⛰️个人主页: 蒾酒
系列专栏《spring boot实战》
山高路远行路漫漫终有归途。 目录
前置条件
封装目的
常用格式
定义返回结果枚举类
定义返回结果封装类
对返回结果封装
测试封装 前置条件
已经初始化好一个spring boot项目且版本为3X项目可正常启动。
作者版本为3.2.2
初始化教程
新版idea(2023)创建spring boot3项目-CSDN博客https://blog.csdn.net/qq_62262918/article/details/135785412?spm1001.2014.3001.5501
封装目的
Spring Boot进行统一结果封装的主要目的是提高开发效率、降低代码重复率并且提供一致的API响应格式从而简化前后端交互和错误处理
具体好处如下 方便前端处理前端可以统一根据返回格式进行处理而不用关注具体的返回类型和内容。 提高 API 的可读性和可维护性统一结果封装可以使 API 的返回更加规范化统一了 API 返回结果的格式使得代码更加易于阅读和维护。 增加系统的健壮性通过统一结果封装能够更好地处理错误和异常情况从而增加系统的健壮性和稳定性。 统一日志输出通过统一结果封装可以方便地记录请求参数、请求结果、异常信息等方便后续的日志分析和排查问题。 常用格式
最常用的格式为状态码、提示信息、携带数据如图 具体格式还要看团队这里我就使用这种通用的格式。 定义返回结果枚举类
通过使用这样的枚举类有助于避免硬编码的状态码和消息提高了代码的可维护性。
import lombok.Getter;/*** author mijiupro*/
Getter
public enum ResultEnum {/* 成功状态码 */SUCCESS(1, 操作成功),/* 错误状态码 */FAIL(0, 操作失败),/* 参数错误10001-19999 */PARAM_IS_INVALID(10001, 参数无效),PARAM_IS_BLANK(10002, 参数为空),PARAM_TYPE_BIND_ERROR(10003, 参数格式错误),PARAM_NOT_COMPLETE(10004, 参数缺失),/* 用户错误20001-29999*/USER_NOT_LOGGED_IN(20001, 用户未登录请先登录),USER_LOGIN_ERROR(20002, 账号不存在或密码错误),USER_ACCOUNT_FORBIDDEN(20003, 账号已被禁用),USER_NOT_EXIST(20004, 用户不存在),USER_HAS_EXISTED(20005, 用户已存在),/* 系统错误40001-49999 */FILE_MAX_SIZE_OVERFLOW(40003, 上传尺寸过大),FILE_ACCEPT_NOT_SUPPORT(40004, 上传文件格式不支持),/* 数据错误50001-599999 */RESULT_DATA_NONE(50001, 数据未找到),DATA_IS_WRONG(50002, 数据有误),DATA_ALREADY_EXISTED(50003, 数据已存在),AUTH_CODE_ERROR(50004, 验证码错误),/* 权限错误70001-79999 */PERMISSION_UNAUTHENTICATED(70001, 此操作需要登陆系统),PERMISSION_UNAUTHORIZED(70002, 权限不足无权操作),PERMISSION_EXPIRE(70003, 登录状态过期),PERMISSION_TOKEN_EXPIRED(70004, token已过期),PERMISSION_LIMIT(70005, 访问次数受限制),PERMISSION_TOKEN_INVALID(70006, 无效token),PERMISSION_SIGNATURE_ERROR(70007, 签名失败);// 状态码int code;// 提示信息String message;ResultEnum(int code, String message) {this.code code;this.message message;}public int code() {return code;}public String message() {return message;}public void setCode(int code) {this.code code;}public void setMessage(String message) {this.message message;}
} 定义返回结果封装类
import com.mijiu.commom.enumerate.ResultEnum;
import lombok.Data;/*** author mijiupro*/Data
public class ResultT {// 操作代码Integer code;// 提示信息String message;// 结果数据T data;public Result(ResultEnum resultCode) {this.code resultCode.code();this.message resultCode.message();}public Result(ResultEnum resultCode, T data) {this.code resultCode.code();this.message resultCode.message();this.data data;}public Result(String message) {this.message message;}//成功返回封装-无数据public static ResultString success() {return new ResultString(ResultEnum.SUCCESS);}//成功返回封装-带数据public static T ResultT success(T data) {return new ResultT(ResultEnum.SUCCESS, data);}//失败返回封装-使用默认提示信息public static ResultString error() {return new ResultString(ResultEnum.FAIL);}//失败返回封装-使用返回结果枚举提示信息public static ResultString error(ResultEnum resultCode) {return new ResultString(resultCode);}//失败返回封装-使用自定义提示信息public static ResultString error(String message) {return new ResultString(message);}
} 对返回结果封装
此时我们就可以使用封装类封装统一格式的响应了 import com.mijiu.common.result.Result;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;/*** author mijiupro*/
RestController
RequestMapping(/test1)
public class Test1Controller {GetMapping(/hello)public ResultString hello() {return Result.success(hello world);}
} 我们的接口通常有很多如果对每个接口都封装属于重复劳动可以利用AOP技术拦截控制类的返回结果进行封装。
代码如下
import cn.hutool.json.JSONUtil;
import com.mijiu.commom.result.Result;
import io.micrometer.common.lang.NonNullApi;
import io.micrometer.common.lang.Nullable;
import org.springframework.core.MethodParameter;
import org.springframework.http.MediaType;
import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;/*** 统一结果封装增强器* author mijiupro*/
RestControllerAdvice(basePackages com.mijiu.controller)//指定要增强的包
NonNullApi
public class ResultAdvice implements ResponseBodyAdviceObject {/*** 判断是否支持对返回类型的处理** param returnType 方法参数的类型* param converterType 转换器的类型* return 是否支持处理*/Overridepublic boolean supports(MethodParameter returnType, Class converterType) {return true;}/*** 在写入响应体之前对返回结果进行处理和封装** param body 返回结果对象* param returnType 方法参数的类型* param selectedContentType 响应内容的类型* param selectedConverterType 转换器的类型* param request HTTP 请求对象* param response HTTP 响应对象* return 处理后的返回结果*/Overridepublic Object beforeBodyWrite(Nullable Object body, MethodParameter returnType,MediaType selectedContentType, Class selectedConverterType,ServerHttpRequest request, ServerHttpResponse response) {//当返回结果为字符串类型需要单独处理if (body instanceof String) {// 如果返回结果是字符串类型将其封装为成功的结果对象并转换为 JSON 字符串return JSONUtil.toJsonStr(Result.success(body));}// 将返回结果封装为成功的结果对象return Result.success(body);}
}
此代码可以兼容任何类型的返回结果对其进行统一封装。
为何遇到方法的返回结果是String类型需要手动转成json返回呢
解决java.lang.ClassCastException-CSDN博客https://blog.csdn.net/qq_62262918/article/details/136003915?spm1001.2014.3001.5501
测试封装
现在com.mijiu.controller下的所有控制类的所有方法都会被拦截将返回结果进行统一格式封装。 到这里返回结果统一封装结束。