【SSM】SpringMVC學習筆記7:前后端數據傳輸協議和異常處理

這篇學習筆記是Spring系列筆記的第7篇,該筆記是筆者在學習黑馬程序員SSM框架教程課程期間的筆記,供自己和他人參考。


Spring學習筆記目錄

筆記1:【SSM】Spring基礎: IoC配置學習筆記-CSDN博客?對應黑馬課程P1~P20的內容。

筆記2: 【SSM】Spring學習筆記2:注解配置bean_ssm黑馬筆記-CSDN博客?對應黑馬課程P21~P27

筆記3:?【SSM】Spring學習筆記3:Spring整合MyBatis和Junit_spring整合mybaits-CSDN博客 對應黑馬課程P28~30

筆記4:【SSM】Spring學習筆記4:Spring的AOP編程-CSDN博客?對應黑馬課程P31~39

筆記5:【SSM】Spring學習筆記5:Spring事務-CSDN博客?對應黑馬課程P40~42

筆記6: 【SSM】SpringMVC學習筆記6:SpringMVC入門-CSDN博客?對應黑馬課程P43~58

筆記7: 此篇?對應黑馬課程P59~65

筆記8:【SSM】SpringMVC學習筆記8:攔截器-CSDN博客?對應黑馬課程P71~74

筆記9:【SSM】SpringBoot學習筆記1:SpringBoot快速入門-CSDN博客?對應黑馬課程P90~101


1.表現層與前端的數據傳輸協議

一般將需要傳遞的數據,封裝成一個統一的格式。

如下的一種協議規定:data封裝要傳輸的數據,code標記傳遞的數據類型/以及操作是否成功的狀態,msg傳輸操作失敗時候傳輸的信息。

該協議不固定,主要由前后端人員協調好。

public class Result {private Object data;private Integer code;private String msg;public Result() {}public Result(Integer code,Object data) {this.data = data;this.code = code;}public Result(Integer code, Object data, String msg) {this.data = data;this.code = code;this.msg = msg;}//所有屬性得到getter/setter方法和toString()
}

狀態碼code用一個枚舉類來維護。

public class Code {public static final Integer SAVE_OK = 20011;public static final Integer DELETE_OK = 20021;public static final Integer UPDATE_OK = 20031;public static final Integer GET_OK = 20041;public static final Integer SAVE_ERR = 20010;public static final Integer DELETE_ERR = 20020;public static final Integer UPDATE_ERR = 20030;public static final Integer GET_ERR = 20040;public static final Integer SYSTEM_ERR = 50001;public static final Integer SYSTEM_TIMEOUT_ERR = 50002;public static final Integer SYSTEM_UNKNOW_ERR = 59999;public static final Integer BUSINESS_ERR = 60002;
}

在controller類里面返回的數據類型統一成result

@RestController
@RequestMapping("/books")
public class BookController {@Autowiredprivate BookService bookService;@PostMappingpublic Result save(@RequestBody Book book) {boolean flag = bookService.save(book);return new Result(flag ? Code.SAVE_OK:Code.SAVE_ERR,flag);}@PutMappingpublic Result update(@RequestBody Book book) {boolean flag = bookService.update(book);return new Result(flag ? Code.UPDATE_OK:Code.UPDATE_ERR,flag);}@DeleteMapping("/{id}")public Result delete(@PathVariable Integer id) {boolean flag = bookService.delete(id);return new Result(flag ? Code.DELETE_OK:Code.DELETE_ERR,flag);}@GetMapping("/{id}")public Result getById(@PathVariable Integer id) {Book book = bookService.getById(id);Integer code = book != null ? Code.GET_OK : Code.GET_ERR;String msg = book != null ? "" : "數據查詢失敗,請重試!";return new Result(code,book,msg);}@GetMappingpublic Result getAll() {List<Book> bookList = bookService.getAll();Integer code = bookList != null ? Code.GET_OK : Code.GET_ERR;String msg = bookList != null ? "" : "數據查詢失敗,請重試!";return new Result(code,bookList,msg);}
}

2. 異常處理

2.1 常見異常的誘因

?

2.2 異常處理類

為了統一管理,異常可以層層上拋,拋到表現層(寫controller那一層)處理。

@RestControllerAdvice

聲明這個類是個異常處理類,注解@RestControllerAdvice用于全局性處理Controller拋出的異常。

@ExceptionHandler

用于方法上面,標注該方法用于處理什么類型的異常,注解參數接受異常類型。

異常處理之后要返回result信息,因為該異常是表現層處理的異常,而表現層直接和前端相連。返回的result最終會被前端接收。

//@RestControllerAdvice用于標識當前類為REST風格對應的異常處理器
//豆包:主要用于全局性地處理控制器(Controller)所拋出的異常,并且會直接返回 JSON、XML 這類格式的數據,而非視圖。
@RestControllerAdvice
public class ProjectExceptionAdvice {//@ExceptionHandler用于設置當前處理器類對應的異常類型@ExceptionHandler(SystemException.class)public Result doSystemException(SystemException ex){//具體的異常處理……return new Result(ex.getCode(),null,ex.getMessage());}
}

2.3 項目異常處理*

2.3.1 異常分類

項目中的異常可以分為下三種異常,實際情況根據具體情況來定

?

2.3.2 自定義異常

針對自己對項目劃分的異常種類,自定義異常

自定義的異常需要繼承自已有的異常類型。需要為自定義異常提供構造器(根據需要)。自定義異常中自定義屬性code,需要提供get方法和set方法。

業務異常

//自定義異常處理器,用于封裝異常信息,對異常進行分類
public class BusinessException extends RuntimeException{private Integer code;public Integer getCode() {return code;}public void setCode(Integer code) {this.code = code;}public BusinessException(Integer code, String message) {super(message);this.code = code;}public BusinessException(Integer code, String message, Throwable cause) {super(message, cause);this.code = code;}

系統異常

public class SystemException extends RuntimeException{private Integer code;public Integer getCode() {return code;}public void setCode(Integer code) {this.code = code;}public SystemException(Integer code, String message) {super(message);this.code = code;}public SystemException(Integer code, String message, Throwable cause) {super(message, cause);this.code = code;}}

2.3.4 處理自定義異常

在異常處理類中對三種異常分別處理。其中resule返回的信息從異常對象中獲取。

@RestControllerAdvice
public class ProjectExceptionAdvice {//@ExceptionHandler用于設置當前處理器類對應的異常類型@ExceptionHandler(SystemException.class)public Result doSystemException(SystemException ex){//記錄日志//發送消息給運維//發送郵件給開發人員,ex對象發送給開發人員return new Result(ex.getCode(),null,ex.getMessage());}@ExceptionHandler(BusinessException.class)public Result doBusinessException(BusinessException ex){return new Result(ex.getCode(),null,ex.getMessage());}//除了自定義的異常處理器,保留對Exception類型的異常處理,用于處理非預期的異常@ExceptionHandler(Exception.class)public Result doOtherException(Exception ex){//記錄日志//發送消息給運維//發送郵件給開發人員,ex對象發送給開發人員return new Result(Code.SYSTEM_UNKNOW_ERR,null,"系統繁忙,請稍后再試!");}
}

2.3.5 使用自定義異常

系統遇到一個異常會不會自動識別成自定義異常,需要在異常可能出現的地方手動包裝成自定義異常。

public Book getById(Integer id) {//模擬業務異常,包裝成自定義異常if(id == 1){throw new BusinessException(Code.BUSINESS_ERR,"業務異常");}//模擬系統異常,將可能出現的異常進行包裝,轉換成自定義異常try{int i = 1/0;}catch (Exception e){throw new SystemException(Code.SYSTEM_TIMEOUT_ERR,"服務器訪問超時,請重試!",e);}return bookDao.getById(id);
}

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

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

相關文章

借助 Spring AI 和 LM Studio 為業務系統引入本地 AI 能力

Spring AI 1.0.0-SNAPSHOTLM Studio 0.3.16qwen3-4b 參考 Unable to use spring ai with LMStudio using spring-ai openai module Issue #2441 spring-projects/spring-ai GitHub LM Studio 下載安裝 LM Studio下載 qwen3-4b 模型。對于 qwen3 系列模型&#xff0c;測試…

C++學習-入門到精通【13】標準庫的容器和迭代器

C學習-入門到精通【13】標準庫的容器和迭代器 目錄 C學習-入門到精通【13】標準庫的容器和迭代器一、標準模板庫簡介1.容器簡介2.STL容器總覽3.近容器4.STL容器的通用函數5.首類容器的通用typedef6.對容器元素的要求 二、迭代器簡介1.使用istream_iterator輸入&#xff0c;使用…

Vue Router的核心實現原理深度解析

1. Vue Router的基本架構 Vue Router的核心功能是實現前端路由&#xff0c;即在不重新加載頁面的情況下更改應用的視圖。它的基本架構包括&#xff1a; 路由配置&#xff1a;定義路徑與組件的映射關系路由實例&#xff1a;管理路由狀態和提供導航方法路由視圖&#xff1a;渲染…

設計模式——狀態設計模式(行為型)

摘要 狀態設計模式是一種行為型設計模式&#xff0c;核心在于允許對象在內部狀態改變時改變行為。它通過狀態對象封裝不同行為&#xff0c;使狀態切換靈活清晰。該模式包含環境類、抽象狀態類和具體狀態類等角色&#xff0c;具有避免大量分支判斷、符合單一職責和開閉原則等特…

C++ 觀察者模式:設計與實現詳解

一、引言 在現代軟件開發中,組件間的交互與通信是系統設計的核心挑戰之一。觀察者模式(Observer Pattern)作為一種行為設計模式,提供了一種優雅的解決方案,用于實現對象間的一對多依賴關系。本文將深入探討 C++ 中觀察者模式的設計理念、實現方式及其應用場景。 二、觀察…

Windows 賬號管理與安全指南

Windows 賬號管理與安全指南 概述 Windows 賬號管理是系統安全的基礎&#xff0c;了解如何正確創建、管理和保護用戶賬戶對于系統管理員和安全專業人員至關重要。本文詳細介紹 Windows 系統中的賬戶管理命令、隱藏賬戶創建方法以及安全防護措施。 基礎賬戶管理命令 net use…

[藍橋杯]擺動序列

擺動序列 題目描述 如果一個序列的奇數項都比前一項大&#xff0c;偶數項都比前一項小&#xff0c;則稱為一個擺動序列。即 a2i<a2i?1,a2i1 >a2ia2i?<a2i?1?,a2i1? >a2i?。 小明想知道&#xff0c;長度為 mm&#xff0c;每個數都是 1 到 nn 之間的正整數的…

Python 網絡編程 -- WebSocket編程

作者主要是為了用python構建實時網絡通信程序。 概念性的東西越簡單越好理解,因此,下面我從晚上摘抄的概念 我的理解。 什么是網絡通信? 更確切地說&#xff0c;網絡通信是兩臺計算機上的兩個進程之間的通信。比如&#xff0c;瀏覽器進程和新浪服務器上的某個Web服務進程在通…

GM DC Monitor如何實現TCP端口狀態監控-操作分享

本節講解如何通過現有指標提取監控腳本制作自定義的TCP端口監控指標 一、功能介紹 通過提取已有的監控指標的監控命令&#xff0c;來自定義TCP端口的監控指標。 二、配置端口監控 1&#xff09;定位監控腳本 確定腳本及參數如下&#xff1a; check_protocol_tcp.pl --plug…

LabVIEW與Modbus/TCP溫濕度監控系統

基于LabVIEW 開發平臺與 Modbus/TCP 通信協議&#xff0c;設計一套適用于實驗室環境的溫濕度數據采集監控系統。通過上位機與高精度溫濕度采集設備的遠程通信&#xff0c;實現多設備溫濕度數據的實時采集、存儲、分析及報警功能&#xff0c;解決傳統人工采集效率低、環境適應性…

Ntfs!ReadIndexBuffer函數分析之nt!CcGetVirtualAddress函數之nt!CcGetVacbMiss

第一部分&#xff1a; NtfsMapStream( IrpContext, Scb, LlBytesFromIndexBlocks( IndexBlock, Scb->ScbType.Index.IndexBlockByteShift ), Scb->ScbType.Index.BytesPerIndexBuffer, &am…

vite+vue3項目中,單個組件中使用 @use報錯

報錯信息&#xff1a; [plugin:vite:css] [sass] use rules must be written before any other rules.use 官方說明 注意事項&#xff1a; https://sass-lang.com/documentation/at-rules/use/ 樣式表中的 use 規則必須位于所有其他規則&#xff08;除 forward 外&#xff0…

基于VMD-LSTM融合方法的F10.7指數預報

F10.7 Daily Forecast Using LSTM Combined With VMD Method ??F10.7?? solar radiation flux is a well-known parameter that is closely linked to ??solar activity??, serving as a key index for measuring the level of solar activity. In this study, the ??…

React 新項目

使用git bash 創建一個新項目 建議一開始就創建TS項目 原因在Webpack中改配置麻煩 編譯方法:ts compiler 另一種 bable 最好都配置 $ create-react-app cloundmusic --template typescript 早期react項目 yarn 居多 目前npm包管理居多 目前pnpm不通用 icon 在public文件夾中…

2025年- H65-Lc173--347.前k個高頻元素(小根堆,堆頂元素是當前堆元素里面最小的)--Java版

1.題目描述 2.思路 &#xff08;1&#xff09;這里定義了一個小根堆&#xff08;最小堆&#xff09;&#xff0c;根據元素的頻率從小到大排序。小根堆原理&#xff1a;堆頂是最小值&#xff0c;每次插入或刪除操作會保持堆的有序結構&#xff08;常用二叉堆實現&#xff09;。 …

VR/AR 顯示瓶頸將破!鐵電液晶技術迎來關鍵突破

在 VR/AR 設備逐漸走進大眾生活的今天&#xff0c;顯示效果卻始終是制約其發展的一大痛點。紗窗效應、畫面拖影、眩暈感…… 傳統液晶技術的瓶頸讓用戶體驗大打折扣。不過&#xff0c;隨著鐵電液晶技術的重大突破&#xff0c;這一局面有望得到徹底改變。 一、傳統液晶技術瓶頸…

【bug】Error: /undefinedfilename in (/tmp/ocrmypdf.io.9xfn1e3b/origin.pdf)

在使用ocrmypdf的時候&#xff0c;需要Ghostscript9.55及以上的版本&#xff0c;但是ubuntu自帶為9.50 然后使用ocrmypdf報錯了 sudo apt update sudo apt install ghostscript gs --version 9.50 #版本不夠安裝的版本為9.50不夠&#xff0c;因此去官網https://ghostscript.c…

【TinyWebServer】線程同步封裝

目錄 POSIX信號量 int sem_init(sem_t* sem,int pshared,unsingned int value); int sem_destroy(sem_t* sem); int sem_wait(sem_t* sem); int sem_post(sem_t* sem); 互斥量 條件變量 為了對多線程程序實現同步問題&#xff0c;可以用信號量POSIX信號量、互斥量、條件變…

打造高效多模態RAG系統:原理與評測方法詳解

引言 隨著信息檢索與生成式AI的深度融合&#xff0c;檢索增強生成&#xff08;RAG, Retrieval-Augmented Generation&#xff09; 已成為AI領域的重要技術方向。傳統RAG系統主要依賴文本數據&#xff0c;但真實世界中的信息往往包含圖像、表格等多模態內容。多模態RAG&#xf…

Unity安卓平臺開發,啟動app并傳參

using UnityEngine; using System;public class IntentReceiver : MonoBehaviour {public bool isVR1;void Start(){Debug.LogError("app1111111111111111111111111");if (isVR1){LaunchAnotherApp("com.HappyMaster.DaKongJianVR2");}else{// 檢查是否有傳…