【SpringBoot】_統一功能處理:統一數據返回格式

目錄

1. 對所有返回類型方法進行統一數據返回類型處理

2.?部分返回類型方法存在的問題

3. 對兩種有誤的方法進行處理


仍以圖書管理系統為例。

創建Result對后端返回給前端的數據進行封裝,增加業務狀態碼與錯誤信息,將原本的數據作為data部分:

package com.example.bookmanagementsystem.model;import com.example.bookmanagementsystem.enums.ResultCode;
import lombok.Data;@Data
public class Result<T> {
//    業務狀態碼:0-成功, -1-失敗, -2未登錄;private ResultCode code;
//    錯誤信息;private String errMsg;
//    數據private Object data;public static <T> Result<T> success(T data){Result result=new Result();result.setCode(ResultCode.SUCCESS);result.setErrMsg("");result.setData(data);return result;}public static  <T> Result<T> fail(String errMsg,Object data){Result result=new Result();result.setCode(ResultCode.FAIL);result.setErrMsg(errMsg);result.setData(data);return result;}public static  <T> Result<T> fail(String errMsg){Result result=new Result();result.setCode(ResultCode.FAIL);result.setErrMsg(errMsg);result.setData(null);return result;}public static  <T> Result<T> unlogin(){Result result=new Result();result.setCode(ResultCode.UNLOGIN);result.setErrMsg("用戶未登錄");result.setData(null);return result;}
}

將getBookListByPage方法的返回值修改為Result:

@RequestMapping("/getBookListByPage")public Result getBookListByPage(PageRequest pageRequest, HttpSession session){log.info("接收到查詢翻頁信息:pageRequest:{}",pageRequest);// 校驗成功if(pageRequest.getPageSize()<0 || pageRequest.getCurrentPage()<1) {return Result.fail("參數校驗失敗");}PageResult<BookInfo> bookInfoPageResult=null;try{bookInfoPageResult = bookService.selectBookInfoByPage(pageRequest);return Result.success(bookInfoPageResult);}catch (Exception e){log.error("查詢翻頁信息錯誤:e{}",e);return Result.fail(e.getMessage());}}

?為了實現后端方法返回給前端的數據都被封裝為Result類型,若逐個修改封裝會非常麻煩,接下來采用統一數據返回對現有方法進行處理。

1. 對所有返回類型方法進行統一數據返回類型處理

在config包下創建一個ResponseAdvice類,表示控制器通知類:

package com.example.bookmanagementsystem.config;import com.example.bookmanagementsystem.model.Result;
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.ControllerAdvice;
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;@ControllerAdvice
public class ResponseAdvice implements ResponseBodyAdvice {@Overridepublic boolean supports(MethodParameter returnType, Class converterType) {return true;}@Overridepublic Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, Class selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) {
//        返回前需要執行的操作:封裝return Result.success(body);}
}

1、控制器通知類需要使用@ControllerAdvice注解,并實現ResponseBodyAdvice接口;

2、控制器通知類需要重寫supports方法和beforeBodyWrite方法:

(1)supports方法:返回值為布爾類型,表示是否執行beforeBodyWrite方法

若返回值為true表示執行,false表示不執行;

(2)beforeBodyWrite方法:對response方法進行具體操作

2.?部分返回類型方法存在的問題

1、當返回類型為Result時:(Result類型已進行返回類型的封裝)

登錄后,測試getBookListByPage方法:

body就是返回的結果,但success方法已經進行了封裝,故而導致兩遍封裝:

2、當返回類型為String時:

登錄后,對updateBook方法進行測試:

可見HTTP狀態碼為500,表示服務器內部執行有誤。但此時采用的統一數據返回形式卻將業務狀態碼置為SUCCESS,出現錯誤;

綜上:

當前統一數據返回格式處理對于兩種返回類型的方法存在錯誤:
(1)返回類型為Result時出現嵌套封裝;

(2)返回類型為String時無法正確處理;

3. 對兩種有誤的方法進行處理

修改ResponseAdvice類:

package com.example.bookmanagementsystem.config;import com.example.bookmanagementsystem.model.Result;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.SneakyThrows;
import org.springframework.beans.factory.annotation.Autowired;
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.ControllerAdvice;
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;@ControllerAdvice
public class ResponseAdvice implements ResponseBodyAdvice {@Autowiredprivate ObjectMapper objectMapper;@Overridepublic boolean supports(MethodParameter returnType, Class converterType) {return true;}@SneakyThrows    // lombok提供的處理異常的注解:編譯后處理為try catch;@Overridepublic Object beforeBodyWrite(Object body,MethodParameter returnType,MediaType selectedContentType,Class selectedConverterType,ServerHttpRequest request,ServerHttpResponse response) {
//        返回前需要執行的操作:封裝if(body instanceof Result){return body;}if(body instanceof String){return objectMapper.writeValueAsString(Result.success(body));}return Result.success(body);}
}

(1)對于返回類型為Result的方法進行處理,當body為Result時直接返回body即可,無需進行統一數據返回;

(2)對于返回類型為String類型的方法進行處理,此時需使用jackson的ObjectMapper類,實例化對象后調用writeValueAsString方法進行處理;

使用postman進行測試:

1、使用getBookListByPage方法(返回值為Result類型)進行測試:

2、使用updateBook方法(返回值為String類型)進行測試:

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/70583.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/70583.shtml
英文地址,請注明出處:http://en.pswp.cn/web/70583.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

智能交通系統(Intelligent Transportation Systems):智慧城市中的交通革新

智能交通系統&#xff08;Intelligent Transportation Systems, ITS&#xff09;是利用先進的信息技術、通信技術、傳感技術、計算機技術以及自動化技術等&#xff0c;來提升交通系統效率和安全性的一種交通管理方式。ITS通過收集和分析交通數據&#xff0c;智能化地調度、控制…

Unity百游修煉(1)——FootBall詳細制作全流程

一、引言 游玩測試&#xff1a; Football 游玩測試 1.項目背景與動機 背景&#xff1a;在學習 Unity 的過程中&#xff0c;希望通過實際項目來鞏固所學知識&#xff0c;同時出于對休閑小游戲的喜愛&#xff0c;決定開發一款簡單有趣的小游戲加深自己的所學知識點。 動機&#…

QQ登錄測試用例報告

QQ登錄測試用例思維導圖 一、安全性測試用例 1. 加密傳輸與存儲驗證 測試場景&#xff1a;輸入賬號密碼并提交登錄請求。預期結果&#xff1a;賬號密碼通過加密傳輸&#xff08;如HTTPS&#xff09;與存儲&#xff08;如哈希加鹽&#xff09;&#xff0c;無明文暴露。 2. 二…

無人機實戰系列(三)本地攝像頭+遠程GPU轉換深度圖

這篇文章將結合之前寫的兩篇文章 無人機實戰系列&#xff08;一&#xff09;在局域網內傳輸數據 和 無人機實戰系列&#xff08;二&#xff09;本地攝像頭 Depth-Anything V2 實現了以下功能&#xff1a; 本地筆記本攝像頭發布圖像 遠程GPU實時處理&#xff08;無回傳&#…

讀取羅克韋爾AllenBradley Micro-Logix1400 羅克韋爾 CIP PCCC通信協議

通信協議實例下載 <-----實例下載 MicroLogix 1400的通信能力 MicroLogix 1400支持多種通信協議&#xff0c;包括CIP&#xff08;通過EtherNet/IP實現&#xff09;、Modbus RTU/TCP、DF1等4812。其硬件集成以太網端口&#xff0c;便于通過EtherNet/IP進行CIP通信15。 CIP…

Python游戲編程之賽車游戲6-5

1 碰撞檢測 在顯示了玩家汽車和“敵人”汽車之后&#xff0c;接下來就要實現玩家與“敵人”的碰撞檢測了。 代碼如圖1所示。 圖1 碰撞檢測代碼 第72行代碼通過pygame.sprite.spritecollideany()函數判斷P1和enemies是否發生了碰撞&#xff0c;如果發生碰撞&#xff0c;該函數…

【QT 網絡編程】HTTP協議(二)

文章目錄 &#x1f31f;1.概述&#x1f31f;2.代碼結構概覽&#x1f31f;3.代碼解析&#x1f338;Http_Api_Manager - API管理類&#x1f338;Http_Request_Manager- HTTP請求管理類&#x1f338;ThreadPool - 線程池&#x1f338;TestWindow- 測試類 &#x1f31f;4.運行效果&…

保姆級! 本地部署DeepSeek-R1大模型 安裝Ollama Api 后,Postman本地調用 deepseek

要在Postman中訪問Ollama API并調用DeepSeek模型,你需要遵循以下步驟。首先,確保你有一個有效的Ollama服務器實例運行中,并且DeepSeek模型已經被加載。 可以參考我的這篇博客 保姆級!使用Ollama本地部署DeepSeek-R1大模型 并java通過api 調用 具體的代碼實現參考我這個博…

在PHP Web開發中,實現異步處理有幾種常見方式的優缺點,以及最佳實踐推薦方法

1. 消息隊列 使用消息隊列&#xff08;如RabbitMQ、Beanstalkd、Redis&#xff09;將任務放入隊列&#xff0c;由后臺進程異步處理。 優點&#xff1a; 任務持久化&#xff0c;系統崩潰后任務不丟失。 支持分布式處理&#xff0c;擴展性強。 實現步驟&#xff1a; 安裝消息…

算法15--BFS

BFS 原理經典例題解決FloodFill 算法[733. 圖像渲染](https://leetcode.cn/problems/flood-fill/description/)[200. 島嶼數量](https://leetcode.cn/problems/number-of-islands/description/)[695. 島嶼的最大面積](https://leetcode.cn/problems/max-area-of-island/descrip…

網絡空間安全(2)應用程序安全

前言 應用程序安全&#xff08;Application Security&#xff0c;簡稱AppSec&#xff09;是一個綜合性的概念&#xff0c;它涵蓋了應用程序從開發到部署&#xff0c;再到后續維護的整個過程中的安全措施。 一、定義與重要性 定義&#xff1a;應用程序安全是指識別和修復應用程序…

Plantsimulation中機器人怎么通過阻塞角度設置旋轉135°

創建一個這樣的簡單模型。 檢查PickAndPlace的角度表。源位于180的角位置&#xff0c;而物料終結位于90的角位置。“返回默認位置”選項未被勾選。源每分鐘生成一個零件。啟動模擬時&#xff0c;Plant Simulation會選擇兩個位置之間的最短路徑。示例中的機器人無法繞135的角位…

Fisher信息矩陣(Fisher Information Matrix, FIM)與自然梯度下降:機器學習中的優化利器

Fisher信息矩陣與自然梯度下降&#xff1a;機器學習中的優化利器 在機器學習尤其是深度學習中&#xff0c;優化模型參數是一個核心任務。我們通常依賴梯度下降&#xff08;Gradient Descent&#xff09;來調整參數&#xff0c;但普通的梯度下降有時會顯得“笨拙”&#xff0c;…

Spring Boot集成Swagger API文檔:傻瓜式零基礎教程

Springfox Swagger 是一個用于構建基于 Spring Boot 的 RESTful API 文檔的開源工具。它通過使用注解來描述 API 端點&#xff0c;自動生成易于閱讀和理解的 API 文檔。Springfox 通過在運行時檢查應用程序&#xff0c;基于 Spring 配置、類結構和各種編譯時 Java 注釋來推斷 A…

接口測試基礎 --- 什么是接口測試及其測試流程?

接口測試是軟件測試中的一個重要部分&#xff0c;它主要用于驗證和評估不同軟件組件之間的通信和交互。接口測試的目標是確保不同的系統、模塊或組件能夠相互連接并正常工作。 接口測試流程可以分為以下幾個步驟&#xff1a; 1.需求分析&#xff1a;首先&#xff0c;需要仔細…

kafka-集群縮容

一. 簡述&#xff1a; 當業務增加時&#xff0c;服務瓶頸&#xff0c;我們需要進行擴容。當業務量下降時&#xff0c;為成本考慮。自然也會涉及到縮容。假設集群有 15 臺機器&#xff0c;預計縮到 10 臺機器&#xff0c;那么需要做 5 次縮容操作&#xff0c;每次將一個節點下線…

Spring Boot 概要(官網文檔解讀)

Spring Boot 概述 Spring Boot 是一個高效構建 Spring 生產級應用的腳手架工具&#xff0c;它簡化了基于 Spring 框架的開發過程。 Spring Boot 也是一個“構件組裝門戶”&#xff0c;何為構件組裝門戶呢&#xff1f;所謂的“構件組裝門戶”指的是一個對外提供的Web平臺&#x…

Linux 命令大全完整版(12)

Linux 命令大全 5. 文件管理命令 ln(link) 功能說明&#xff1a;連接文件或目錄。語  法&#xff1a;ln [-bdfinsv][-S <字尾備份字符串>][-V <備份方式>][--help][--version][源文件或目錄][目標文件或目錄] 或 ln [-bdfinsv][-S <字尾備份字符串>][-V…

遺傳算法初探

組成要素 編碼 分為二進制編碼、實數編碼和順序編碼 初始種群的產生 分為隨機方法、基于反向學習優化的種群產生。 基于反向學習優化的種群其思想是先隨機生成一個種群P(N)&#xff0c;然后按照反向學習方法生成新的種群OP(N),合并兩個種群&#xff0c;得到一個新的種群S(N…

【算法】堆

堆 heap&#xff0c;一棵完全二叉樹&#xff0c;使用數組實現的&#xff0c;但具備完全二叉樹的一些性質。一般總是滿足以下性質&#xff1a; 堆中某個節點的值總是不大于或不小于其父節點的值&#xff1b;堆總是一棵完全二叉樹。&#xff08;即除了最底層&#xff0c;其他層…