UserController類講解

用戶管理控制器,實現了用戶CRUD操作的RESTful API:

1. 類結構與核心注解

1.1 控制器聲明

@RestController
@RequestMapping("/api/users")
public class UserController

@RestController 深度解析:

  • 組合注解@Controller + @ResponseBody
  • 自動序列化:返回的對象自動轉換為JSON
  • Spring MVC集成:無需手動配置JSON轉換器
  • RESTful設計:專為API接口設計

@RequestMapping(“/api/users”) 路徑設計:

  • 統一前綴:所有用戶相關接口以/api/users開頭
  • 版本控制:便于后續添加/api/v2/users
  • 語義清晰:一看就知道是用戶管理接口

1.2 依賴注入與日志

private static final Logger log = LoggerFactory.getLogger(UserController.class);@Autowired
private UserService userService;

日志配置:

  • SLF4J框架:統一的日志接口
  • 類級別Logger:每個類有獨立的日志記錄器
  • 靜態final:性能優化,避免重復創建

依賴注入優勢:

  • 松耦合:Controller不直接依賴具體實現
  • 易測試:可以注入Mock對象進行單元測試
  • 配置驅動:Spring容器管理對象生命周期

2. RESTful API設計解析

2.1 HTTP方法與URL映射

功能HTTP方法URL說明
創建用戶POST/api/users創建資源
刪除用戶DELETE/api/users/{id}刪除指定資源
更新用戶PUT/api/users/{id}完整更新資源
查詢單個用戶GET/api/users/{id}獲取指定資源
查詢所有用戶GET/api/users獲取資源列表
分頁查詢GET/api/users/page分頁獲取資源

RESTful設計優點:

  • 語義明確:HTTP方法表達操作意圖
  • URL簡潔:資源導向的路徑設計
  • 標準化:遵循HTTP協議規范

3. 核心接口詳細解析

3.1 創建用戶接口

@PostMapping
public Result<User> createUser(@RequestBody User user) {try {User createdUser = userService.createUser(user);return Result.success(createdUser);} catch (Exception e) {log.error("創建用戶失敗", e);return Result.<User>error(e.getMessage());}
}

@PostMapping 解析:

  • HTTP POST:用于創建資源
  • 無路徑參數:直接映射到類路徑/api/users

@RequestBody 詳解:

  • JSON反序列化:自動將請求體JSON轉換為User對象
  • Content-Type要求:前端需設置application/json
  • 參數驗證:可結合Bean Validation進行參數校驗

前端請求示例:

// 前端請求
fetch('/api/users', {method: 'POST',headers: {'Content-Type': 'application/json'},body: JSON.stringify({username: 'newuser',password: '123456',email: 'newuser@example.com'})
})

3.2 刪除用戶接口

@DeleteMapping("/{id}")
public Result<Void> deleteUser(@PathVariable Long id) {try {boolean success = userService.deleteUser(id);if (success) {return Result.success();} else {return Result.<Void>error("用戶不存在");}} catch (Exception e) {log.error("刪除用戶失敗", e);return Result.<Void>error(e.getMessage());}
}

@PathVariable 詳解:

  • 路徑參數提取:從URL/api/users/123中提取id=123
  • 類型轉換:自動將字符串轉換為Long類型
  • 參數驗證:Spring自動處理類型轉換異常

業務邏輯處理:

  • 存在性檢查:先檢查用戶是否存在
  • 狀態反饋:根據刪除結果返回不同信息
  • 冪等性:多次刪除同一資源結果一致

3.3 更新用戶接口

@PutMapping("/{id}")
public Result<User> updateUser(@PathVariable Long id, @RequestBody User user) {try {user.setId(id);  // 關鍵:設置ID確保更新正確的用戶User updatedUser = userService.updateUser(user);return Result.success(updatedUser);} catch (Exception e) {log.error("更新用戶失敗", e);return Result.<User>error(e.getMessage());}
}

設計要點:

  • PUT語義:完整替換資源
  • ID一致性:URL中的ID覆蓋請求體中的ID
  • 返回更新后數據:便于前端同步最新狀態

前端使用示例:

// 更新用戶信息
fetch('/api/users/123', {method: 'PUT',headers: { 'Content-Type': 'application/json' },body: JSON.stringify({username: 'updateduser',email: 'updated@example.com'})
})

3.4 查詢接口設計

單用戶查詢
@GetMapping("/{id}")
public Result<User> getUserById(@PathVariable Long id)
用戶名查詢
@GetMapping("/username/{username}")
public Result<User> getUserByUsername(@PathVariable String username)
郵箱查詢
@GetMapping("/email/{email}")
public Result<User> getUserByEmail(@PathVariable String email)

URL設計模式:

  • RESTful風格/資源/查詢條件/值
  • 語義明確:URL即文檔
  • 易于理解:符合直覺的路徑結構

3.5 分頁查詢核心實現

@GetMapping("/page")
public Result<Map<String, Object>> getUsersByPage(@RequestParam(defaultValue = "1") Integer pageNum,@RequestParam(defaultValue = "10") Integer pageSize,@RequestParam(required = false) String username) {

@RequestParam 詳解:

  • defaultValue:提供默認值,提升用戶體驗
  • required = false:可選參數,支持條件查詢
  • 類型轉換:自動將字符串轉換為Integer

分頁邏輯:

// 條件分支:搜索 vs 普通分頁
if (username != null && !username.trim().isEmpty()) {users = userService.searchUsersByUsername(username, pageNum, pageSize);total = userService.getSearchTotalCount(username);
} else {users = userService.getUsersByPage(pageNum, pageSize);total = userService.getTotalCount();
}

返回數據結構:

Map<String, Object> data = new HashMap<>();
data.put("list", users);           // 當前頁數據
data.put("total", total);          // 總記錄數
data.put("pageNum", pageNum);      // 當前頁碼
data.put("pageSize", pageSize);    // 每頁大小
data.put("pages", (total + pageSize - 1) / pageSize); // 總頁數

前端調用示例:

// 普通分頁
fetch('/api/users/page?pageNum=1&pageSize=10')// 搜索分頁
fetch('/api/users/page?pageNum=1&pageSize=10&username=zhang')

3.6 密碼修改接口

@PutMapping("/{id}/password")
public Result<Void> changePassword(@PathVariable Long id, @RequestBody Map<String, String> passwordData)

設計特點:

  • 專用接口:密碼修改獨立于普通更新
  • 安全考慮:需要提供原密碼驗證
  • Map參數:靈活接收鍵值對數據

請求體格式:

{"oldPassword": "123456","newPassword": "newpass123"
}

安全驗證流程:

// 1. 參數驗證
if (oldPassword == null || newPassword == null) {return Result.<Void>error("密碼不能為空");
}// 2. 用戶存在性檢查
User user = userService.getUserById(id);
if (user == null) {return Result.<Void>error("用戶不存在");
}// 3. 原密碼驗證
if (!oldPassword.equals(user.getPassword())) {return Result.<Void>error("原密碼錯誤");
}

4. 異常處理機制

4.1 統一異常處理模式

try {// 業務邏輯
} catch (Exception e) {log.error("操作失敗", e);return Result.<Type>error(e.getMessage());
}

異常處理優勢:

  • 用戶友好:返回可讀的錯誤信息
  • 系統穩定:防止異常導致系統崩潰
  • 便于調試:記錄詳細的錯誤日志

4.2 改進

// 更細粒度的異常處理
try {// 業務邏輯
} catch (BusinessException e) {// 業務異常log.warn("業務異常: {}", e.getMessage());return Result.error(e.getMessage());
} catch (DataAccessException e) {// 數據訪問異常log.error("數據庫操作失敗", e);return Result.error("系統繁忙,請稍后重試");
} catch (Exception e) {// 未知異常log.error("系統異常", e);return Result.error("系統錯誤");
}

5. 響應格式統一

5.1 成功響應

{"code": 200,"message": "操作成功","data": {"id": 1,"username": "admin","email": "admin@example.com"}
}

5.2 失敗響應

{"code": 500,"message": "用戶不存在","data": null
}

5.3 分頁響應

{"code": 200,"message": "操作成功","data": {"list": [...],"total": 50,"pageNum": 1,"pageSize": 10,"pages": 5}
}
  1. RESTful標準:符合HTTP協議語義

  2. 統一響應格式:便于前端處理

  3. 完整CRUD操作:功能齊全

  4. 異常處理機制:提升系統穩定性

  5. 日志記錄:便于問題排查

  6. 參數驗證:基礎的輸入校驗

  7. 參數驗證增強:使用Bean Validation

  8. 權限控制:添加認證授權

  9. 接口文檔:使用Swagger注解

  10. 批量操作:支持批量刪除/更新

  11. 緩存策略:添加查詢緩存

  12. 限流控制:防止接口被惡意調用

7.1 參數驗證增強

@PostMapping
public Result<User> createUser(@RequestBody @Valid User user, BindingResult bindingResult) {if (bindingResult.hasErrors()) {return Result.error("參數驗證失敗:" + bindingResult.getFieldError().getDefaultMessage());}// 業務邏輯...
}

7.2 權限控制

@GetMapping("/{id}")
@PreAuthorize("hasRole('USER') or hasRole('ADMIN')")
public Result<User> getUserById(@PathVariable Long id) {// 業務邏輯...
}

7.3 API文檔

@GetMapping("/{id}")
@ApiOperation(value = "根據ID查詢用戶", notes = "返回用戶詳細信息")
@ApiParam(name = "id", value = "用戶ID", required = true)
public Result<User> getUserById(@PathVariable Long id) {// 業務邏輯...
}

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

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

相關文章

【劍指offer】搜索算法

目錄 &#x1f4c1; JZ53 數字在升序數組中出現的次數?編輯 &#x1f4c1; JZ4 二維數組中的查找?編輯 &#x1f4c1; JZ11 旋轉數組的最小數字 &#x1f4c1; JZ38 字符串的排列?編輯 &#x1f4c1; JZ53 數字在升序數組中出現的次數 這就是一道簡單的模板題&#xff0…

ETLCloud批流一體化體現在哪

ETLCloud批流一體化體現在哪 企業對數據處理的實時性、高效性和準確性的要求越來越高。批流一體化作為一種先進的數據處理理念&#xff0c;逐漸被企業所采用。 目前許多國產化ETL工具也裝配了十分強大的批流一體化能力&#xff0c;ETLCoud就是一個很好的代表&#xff0c;它能夠…

Mybatis學習之緩存(九)

這里寫目錄標題一、MyBatis的一級緩存1.1、工作原理1.2、一級緩存失效的四種情況1.3、不同的SqlSession對應不同的一級緩存1.4、同一個SqlSession但是查詢條件不同1.5、同一個SqlSession兩次查詢期間執行了任何一次增刪改操作1.6、同一個SqlSession兩次查詢期間手動清空了&…

windows10裝Ubuntu22.04系統(雙系統)

參考鏈接&#xff1a;Windows和Linux雙系統的保姆級安裝教程&#xff0c;新手小白跟著也能裝_windows安裝linux雙系統-CSDN博客 1 前期準備 1.下載Ubuntu22.04.5 的iso鏡像文件&#xff1a;Download Ubuntu Desktop | Ubuntu 2.準備一個U盤&#xff08;空&#xff0c;已有文…

Pandas數據處理與分析實戰:Pandas數據清洗與處理入門

數據清洗&#xff1a;Pandas數據處理入門 學習目標 本課程將引導學員了解數據清洗的基本概念&#xff0c;掌握使用Pandas庫處理數據集中的缺失值、重復數據和異常值的方法&#xff0c;確保數據的質量&#xff0c;為后續的數據分析和機器學習任務打下堅實的基礎。 相關知識點 Pa…

Python爬蟲實戰:研究ScrapyRT框架,構建圖書商城數據采集系統

1. 引言 1.1 研究背景 在當今數字化時代,互聯網已成為全球最大的信息庫,蘊含著海量的有價值數據,涵蓋商業、教育、科研、醫療等各個領域。根據 IDC(國際數據公司)預測,到 2025 年全球數據圈將增長至 175ZB,其中網絡數據占比超過 60%。這些數據不僅是企業制定商業策略、…

springboot接口請求參數校驗

參數校驗 參數校驗可以防止無效或錯誤的數據進入系統。通過校驗前端輸入的參數&#xff0c;可以確保數據的完整性&#xff0c;避免因為缺少必要的信息而導致程序錯誤或異常。例如&#xff0c;對于密碼字段&#xff0c;可以通過校驗規則要求用戶輸入至少8個字符、包含字母和數字…

Docker部署 Neo4j 及集成 APOC 插件:安裝與配置完整指南(docker-compose)

Docker部署 Neo4j 及集成 APOC 插件&#xff1a;分步驟指南 摘要 &#xff1a;本文將分兩部分詳細介紹相關內容。第一部分講解如何使用 Docker Compose 部署 Neo4j 圖數據庫&#xff0c;提供完整配置文件及常見問題解決方案&#xff1b;第二部分在前者基礎上&#xff0c;介紹 A…

TLSv1.2協議與TCP/UDP協議傳輸數據內容差異

一、Wireshark中常見的TLSv1.2在用Wireshark抓包時&#xff0c;除了看到課堂上教過的經典的TCP/UDP協議&#xff0c;還有一個協議經常出現——TLSv1.2。并且這個協議的Info解釋是Application data&#xff0c;其實看到這個解釋&#xff0c;我大概猜出來了TLSv1.2是用來給用戶數…

51c自動駕駛~合集14

自己的原文哦~ https://blog.51cto.com/whaosoft/11707335 #Text2LiDAR 文本引導的無條件點云生成新SOTA 論文題目&#xff1a;《Text2LiDAR: Text-guided LiDAR Point Cloud Generation via Equirectangular Transformer》 論文地址&#xff1a;https://arxiv.o…

k8s基本概念

k8s 的基本概念 Kubernetes是一個可以移植、可擴展的開源平臺&#xff0c;使用 聲明式的配置 并依據配置信息自動地執行容器化應用程序的管理。在所有的容器編排工具中&#xff08;類似的還有 docker swarm / mesos等&#xff09;&#xff0c;Kubernetes的生態系統更大、增長更…

Easysearch 數據遷移之數據比對

上一篇我們通過 INFINI Gateway 進行了索引數據遷移&#xff0c;對索引遷移結果進行了初步且直觀的校驗--對比索引的文檔數是否一致。今天介紹個實實在在的數據比對方法&#xff0c;通過網關對比索引文檔的內容在兩個集群是否一致。話不多說&#xff0c;就拿上次遷移的兩個索引…

Codeforces Round 1042 (Div. 3)

ABCD 略E注意到每個操作最多執行一次&#xff0c;ifa[i]!b[i]&#xff0c;要么a[i]^a[i1]要么a[i]^b[i1]G設消除1~i的數的操作次數為f[i]&#xff0c;可以推出f[i]2*f[i-1]1&#xff0c;那么消除1~i的數的分數乘的數為g[i]&#xff0c;g[i]g[i-1]*g[i-1]*i s雖然很大&#xff0…

AJAX:讓你的網頁“靜悄悄”變聰明,體驗絲滑升級

大家好&#xff0c;今天想聊聊一個讓網頁“活”起來的小秘密——AJAX。你可能遇到過這種情況&#xff1a;點個按鈕&#xff0c;頁面就刷新&#xff0c;等得心急火燎。但用了AJAX的網站&#xff0c;比如購物車更新或搜索建議&#xff0c;數據嗖嗖就來了&#xff0c;整個頁面卻紋…

【iOS】Block基礎知識和底層探索

文章目錄前言Block的聲明和創建問題引入Block的底層結構Block的執行流程Block的創建與存儲Block的傳遞與調用Block的捕獲機制捕獲局部變量捕獲全局變量小結Block的類型__block修飾符__block變量的包裝結構體block的實例結構體block的執行邏輯Block循環引用造成的原因解決方法小…

1.Ansible 自動化介紹

1-Ansible 自動化介紹 Ansible 自動化介紹 手動執行任務和自動化執行任務 手動執行任務的麻煩事&#xff1a; 很容易漏掉某個步驟&#xff0c;或者不小心執行錯步驟&#xff0c;而且很難驗證每個步驟是不是真的按預期完成了。管理一大堆服務器時&#xff0c;很容易出現配置…

2025年云手機場景適配的行業觀察

2025年的市場中&#xff0c;云手機品牌百花齊放&#xff0c;不同品牌在性能、功能和場景適配性上的差異日益顯著。隨著云計算技術的快速發展&#xff0c;云手機已從 嘗鮮工具 演變為游戲、辦公、企業運營等場景的剛需工具。現市面上也有著更多的云手機品牌&#xff0c;結合實測…

Date/Calendar/DateFormat/LocalDate

作用說明Date用于定義時間&#xff0c;提供date對象間的比較方法Calendar(日歷類),提供對時間的運算方法DateFormat是接口&#xff0c;它的實現類SimpleDateFormat用來規范時間輸出形式LocalDate&#xff0c;在JDK1.8之后引入&#xff0c;方便了對時間的運算方法介紹Date常用方…

在Python 3.8環境中安裝Python 3.6兼容包的方法

在Python 3.8環境中安裝Python 3.6兼容包的方法 用戶的需求是&#xff1a;在Python 3.8環境中重新安裝原本為Python 3.6設計的包。這通常涉及兼容性問題&#xff0c;因為Python 3.8可能引入了一些語法或API變更&#xff0c;導致舊包無法直接運行。以下是逐步解決方案&#xff…

三種DuckDB電子表格插件的union all查詢性能對比

我選取了最穩定、兼容性最好的三種&#xff1a;官方excel對應函數read_xlsx()、官方spatial對應函數st_read()、rusty_sheet對應函數read_sheet。 1.建立兩個包含前50萬和后54萬的xlsx文件&#xff0c;用于比較。利用官方excel的copy()to進行。 D copy (from v1 order by l_ord…