后端通用基礎代碼

后端通用基礎代碼

通用基礎代碼是指:“無論在任何后端項目中,都可以復用的代碼。這種代碼一般 “一輩子只用寫一次” ,了解作用之后復制粘貼即可,無需記憶。

目錄結構如下:

在這里插入圖片描述

1、自定義異常

自定義錯誤碼,對錯誤進行收斂,便于前端統一處理。

這里有兩個小技巧:

  1. 自定義錯誤碼時,建議跟主流的錯誤碼(比如 HTTP 錯誤碼)的含義保持一致,比如 “未登錄” 定義為 40100,和 HTTP 401 錯誤(用戶需要進行身份認證)保持一致,會更容易理解。
  2. 錯誤碼不要完全連續,預留一些間隔,便于后續擴展。

exception 包下新建錯誤碼枚舉類:

import lombok.Getter;@Getter
public enum ErrorCode {SUCCESS(0, "ok"),PARAMS_ERROR(40000, "請求參數錯誤"),NOT_LOGIN_ERROR(40100, "未登錄"),NO_AUTH_ERROR(40101, "無權限"),NOT_FOUND_ERROR(40400, "請求數據不存在"),FORBIDDEN_ERROR(40300, "禁止訪問"),SYSTEM_ERROR(50000, "系統內部異常"),OPERATION_ERROR(50001, "操作失敗");/*** 狀態碼*/private final int code;/*** 信息*/private final String message;ErrorCode(int code, String message) {this.code = code;this.message = message;}}

一般不建議直接拋出 Java 內置的 RuntimeException,而是自定義一個業務異常,和內置的異常類區分開,便于定制化輸出錯誤信息:

exception 包下新建業務異常類

import lombok.Getter;@Getter
public class BusinessException extends RuntimeException {/*** 錯誤碼*/private final int code;public BusinessException(int code, String message) {super(message);this.code = code;}public BusinessException(ErrorCode errorCode) {super(errorCode.getMessage());this.code = errorCode.getCode();}public BusinessException(ErrorCode errorCode, String message) {super(message);this.code = errorCode.getCode();}}

為了更方便地根據情況拋出異常,可以封裝一個 ThrowUtils,類似斷言類,簡化拋異常的代碼:

exception 包下新建 ThrowUtils 類

public class ThrowUtils {/*** 條件成立則拋異常** @param condition        條件* @param runtimeException 異常*/public static void throwIf(boolean condition, RuntimeException runtimeException) {if (condition) {throw runtimeException;}}/*** 條件成立則拋異常** @param condition 條件* @param errorCode 錯誤碼*/public static void throwIf(boolean condition, ErrorCode errorCode) {throwIf(condition, new BusinessException(errorCode));}/*** 條件成立則拋異常** @param condition 條件* @param errorCode 錯誤碼* @param message   錯誤信息*/public static void throwIf(boolean condition, ErrorCode errorCode, String message) {throwIf(condition, new BusinessException(errorCode, message));}
}

2、響應包裝類

一般情況下,每個后端接口都要返回調用碼、數據、調用信息等,前端可以根據這些信息進行的處理。

我們可以封裝統一的響應結果類,便于前端統一獲取這些信息。

通用響應類:

新建 common

common 包新建響應包裝類

import lombok.Data;import java.io.Serializable;@Data
public class BaseResponse<T> implements Serializable {private int code;private T data;private String message;public BaseResponse(int code, T data, String message) {this.code = code;this.data = data;this.message = message;}public BaseResponse(int code, T data) {this(code, data, "");}public BaseResponse(ErrorCode errorCode) {this(errorCode.getCode(), null, errorCode.getMessage());}
}

但之后每次接口返回值時,都要手動 new 一個 BaseResponse 對象并傳入參數,比較麻煩,我們可以新建一個工具類,提供成功調用和失敗調用的方法,支持靈活地傳參,簡化調用。

common 包新建工具類

public class ResultUtils {/*** 成功** @param data 數據* @param <T>  數據類型* @return 響應*/public static <T> BaseResponse<T> success(T data) {return new BaseResponse<>(0, data, "ok");}/*** 失敗** @param errorCode 錯誤碼* @return 響應*/public static BaseResponse<?> error(ErrorCode errorCode) {return new BaseResponse<>(errorCode);}/*** 失敗** @param code    錯誤碼* @param message 錯誤信息* @return 響應*/public static BaseResponse<?> error(int code, String message) {return new BaseResponse<>(code, null, message);}/*** 失敗** @param errorCode 錯誤碼* @return 響應*/public static BaseResponse<?> error(ErrorCode errorCode, String message) {return new BaseResponse<>(errorCode.getCode(), null, message);}
}

3、全局異常處理器

為了防止意料之外的異常,利用 AOP 切面全局對業務異常和 RuntimeException 進行捕獲:

exception 包下新建全局異常處理器類

package com.ping.aiagent.exception;import com.ping.aiagent.common.BaseResponse;
import com.ping.aiagent.common.ResultUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;@RestControllerAdvice
@Slf4j
public class GlobalExceptionHandler {@ExceptionHandler(BusinessException.class)public BaseResponse<?> businessExceptionHandler(BusinessException e) {log.error("BusinessException", e);return ResultUtils.error(e.getCode(), e.getMessage());}@ExceptionHandler(RuntimeException.class)public BaseResponse<?> runtimeExceptionHandler(RuntimeException e) {log.error("RuntimeException", e);return ResultUtils.error(ErrorCode.SYSTEM_ERROR, "系統錯誤");}
}

4、請求包裝類

對于 “分頁” 、“刪除某條數據” 這類通用的請求,可以封裝統一的請求包裝類,用于接受前端傳來的參數,之后相同參數的請求就不用專門再新建一個類了。

分頁請求包裝類,接受頁號、頁面大小、排序字段、排序順序參數:

common 包新建分頁請求包裝類

import lombok.Data;@Data
public class PageRequest {/*** 當前頁號*/private int current = 1;/*** 頁面大小*/private int pageSize = 10;/*** 排序字段*/private String sortField;/*** 排序順序(默認降序)*/private String sortOrder = "descend";
}

刪除請求包裝類,接受要刪除的 id 作為參數:

common 包新建刪除請求包裝類

import lombok.Data;import java.io.Serializable;@Data
public class DeleteRequest implements Serializable {/*** id*/private Long id;private static final long serialVersionUID = 1L;
}

5、全局跨域配置

跨域是指瀏覽器訪問的 URL(前端地址)和后端接口地址的域名(或端口號)不一致導致的,瀏覽器為了安全,默認禁止跨域請求訪問。

為了開發調試方便,我們可以通過全局跨域配置,讓整個項目所有的接口支持跨域,解決跨域報錯。

新建 config 包,用于存放所有的配置相關代碼。全局跨域配置代碼如下:

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;@Configuration
public class CorsConfig implements WebMvcConfigurer {@Overridepublic void addCorsMappings(CorsRegistry registry) {// 覆蓋所有請求registry.addMapping("/**")// 允許發送 Cookie.allowCredentials(true)// 放行哪些域名(必須用 patterns,否則 * 會和 allowCredentials 沖突).allowedOriginPatterns("*").allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS").allowedHeaders("*").exposedHeaders("*");}
}

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

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

相關文章

基于51單片機WIFI心率計脈搏體溫測量儀APP設計

1 系統功能介紹 本設計基于 STC89C52 單片機&#xff0c;結合 脈搏傳感器、溫度傳感器 DS18B20、LCD1602 液晶顯示器、WiFi 模塊 等外設&#xff0c;構建了一個 WiFi 心率計脈搏體溫測量儀 APP 系統。系統能夠實現對人體心率與體溫的實時采集、處理、顯示和遠程上傳&#xff0c…

從零到一構建企業級GraphRAG系統:GraphRag.Net深度技術解析

當RAG遇上知識圖譜&#xff0c;會碰撞出怎樣的火花&#xff1f;本文將帶你深入探索GraphRag.Net這個開源項目&#xff0c;看看如何用.NET技術棧打造一個企業級的圖譜增強檢索系統。 引言&#xff1a;為什么我們需要GraphRAG&#xff1f; 在AI大模型時代&#xff0c;RAG&#x…

前端Element-plus的選擇器 el-select 清空內容時,后端對應的更新方式,支持更新為null

1、所屬小類選擇器 el-select 清空內容時&#xff0c;前端通過事件設置為空字符串clear"handleSmallCategoryClear"【所屬小類選擇器】只能選擇&#xff0c;不能輸入信息<script setup lang"ts" name"QualityFileInfoDialog"> ...... // 所…

【筆記】和各大AI大語言模型合作寫項目—slirp.go

最近和各大AI大語言模型一起合作寫了個小項目&#xff0c;讓大家看看AI離取代人類還差多遠。 開發大家都在一個共享環境下&#xff0c;連docker都不能運行&#xff0c;rootless也沒有。不過好在linux環境&#xff0c;弄個proot能apt或者yum install自由&#xff0c;但是諸如pod…

國標:開展環境衛生滿意度調查

隨著社會的進步和人們生活水平的提高&#xff0c;&#xff08;滿意度調查&#xff09;&#xff08;問卷調查&#xff09;&#xff08;第三方市場咨詢公司&#xff09;對生活品質的追求以及對環境保護的重視已經成為了當下社會的主旋律。在這樣的背景下&#xff0c;環境衛生問題…

【辦公類-54-08】20250902 2025學年第一學期班級點名冊模版(雙休國定假涂成灰色、修改標題和頁眉,批量導出PDF)根據新Excel模版,標題增加園區、空姓名行填充灰色

背景需求: 之前做了優化過的點名冊 【辦公類-54-07】20250901 2025學年第一學期班級點名冊模版(雙休國定假涂成灰色、修改標題和頁眉,批量導出PDF)-CSDN博客文章瀏覽閱讀984次,點贊27次,收藏29次。【辦公類-54-07】20250901 202學年第一學期班級點名冊模版(雙休國定假…

【C++知識雜記1】智能指針及其分類

智能指針&#xff08;smart pointer&#xff09; 是 C11 引入的一類 模板類&#xff0c;用來封裝原始指針&#xff0c;自動管理堆內存的生命周期&#xff0c;避免出現 內存泄漏 和 懸空指針&#xff08;野指針&#xff09; 的問題。 當智能指針對象離開作用域時&#xff0c;它會…

vue從入門到精通:搭建第一個vue項目

目錄 Vue是什么 一、nodejs安裝 二、安裝Vue CLI 三、創建Vue項目 四、配置vue.config.js文件 五、創建第一個應用hello word Vue是什么 Vue是一款?用于構建用戶界面的 JavaScript 漸進式架構?既可作為庫(僅關注視圖層)也可擴展為框架,支持從靜態頁面到復雜單頁應用…

C# Queue源碼分析

Queue<T> 是 .NET 中實現隊列&#xff08;先進先出&#xff09;的一種泛型集合類。它基于數組實現&#xff0c;支持動態擴容、線程不安全&#xff0c;適用于大多數需要隊列結構的場景。一、類結構與字段說明 public class Queue<T> : IEnumerable<T>, IColle…

微服務之注冊中心與ShardingSphere關于分庫分表的那些事

小伙伴們&#xff0c;你們好呀&#xff01;我是老寇&#xff01;跟我一起學習注冊中心與ShardingSphere怎么一起使用 使用 nacos-shardingsphere例子&#xff0c;請點擊我 注意&#xff1a;需要自己提前創建數據庫和表 create database kcloud_platform_test;DROP TABLE IF…

python遇到異常流程

在 Python 中&#xff0c;程序遇到異常時的退出行為取決于是否對異常進行了捕獲和處理&#xff1a;未捕獲的異常&#xff1a; 如果異常發生后沒有被 try-except 語句捕獲&#xff0c;程序會立即終止&#xff0c;并返回一個非零的退出碼&#xff08;通常是 1&#xff09;&#x…

【開源大模型和閉源大模型分別有哪些?兩者的對比?部署私有化模型的必要性有哪些?】

以下是關于開源與閉源大模型的詳細對比及私有化部署必要性的分析&#xff0c;結合最新行業動態和技術趨勢&#xff1a;一、開源 vs 閉源大模型代表列表 1. 開源大模型&#xff08;2024年主流&#xff09;模型名稱參數量機構特點LLaMA-38B-70BMeta商業使用需授權&#xff0c;多語…

SpringBoot--JWT

一、JWT 的簡單了解1. 什么是 JWT&#xff1f;JWT&#xff08;JSON Web Token&#xff09;是一種開放標準&#xff08;RFC 7519&#xff09;&#xff0c;用于在 各方之間安全地傳輸信息。它基于 JSON 格式&#xff0c;信息通過 數字簽名 的方式保證不可篡改&#xff0c;常用于 …

OpenTelemetry、Jaeger 與 Zipkin:分布式鏈路追蹤方案對比與實踐

OpenTelemetry、Jaeger 與 Zipkin&#xff1a;分布式鏈路追蹤方案對比與實踐 問題背景介紹 隨著微服務架構的普及&#xff0c;服務之間調用鏈路變得異常復雜&#xff0c;單一服務故障或性能瓶頸往往牽一發動全身。分布式鏈路追蹤&#xff08;Distributed Tracing&#xff09;能…

云原生俱樂部-RH124知識點總結(1)

RH124內容不是很多&#xff0c;但是也不知道多少能夠寫完&#xff0c;細節性的東西不會太多&#xff0c;但是確保每個都能夠有印象能理解。本來是打算一篇文章寫完的&#xff0c;但最后還是決定寫一個系列。至于RH124和RH134的內容為什么放在了k8s系列的后面&#xff0c;那只是…

Redis面試精講 Day 25:Redis實現分布式Session與購物車

【Redis面試精講 Day 25】Redis實現分布式Session與購物車 在高并發、多節點的現代Web應用架構中&#xff0c;傳統的本地Session存儲方式已無法滿足分布式系統的需求。如何實現跨服務、高可用、低延遲的用戶狀態管理&#xff0c;成為后端開發和面試中的高頻考點。今天是“Redi…

本地文件上傳到gitee倉庫的詳細步驟

本地文件上傳到gitee倉庫的詳細步驟 &#x1f530; 一、前期準備 注冊 Gitee 賬號 訪問 Gitee 官網完成注冊并登錄。 網址&#xff1a;https://gitee.com/ 安裝 Git 下載 Git 官方客戶端并完成安裝。 下載網址&#xff1a;https://git-scm.com/downloads 配置 Git 全局信息&…

7 索引的監控

1. 查看索引的監控狀態 GET /_cat/indices/log2?v&formatjson[{"health" : "yellow","status" : "open","index" : "log2","uuid" : "1OnzbVbJRn2grc5k198LlA","pri" : "…

【秋招筆試】2025.08.10米哈游秋招機考真題

?? 點擊直達筆試專欄 ??《大廠筆試突圍》 ?? 春秋招筆試突圍在線OJ ?? 筆試突圍在線刷題 bishipass.com 米哈游 題目一:圖書館整理計劃 1??:貪心策略從左到右固定每個位置的最優元素 2??:使用線段樹維護區間最小值信息,支持單點更新和區間查詢 3??:每次選…

恒創科技:日本服務器 ping 不通?從排查到解決的實用指南

玩游戲、做跨境業務時&#xff0c;突然發現日本服務器 ping 不通&#xff0c;簡直能讓人瞬間焦慮 —— 這到底是網絡崩了&#xff0c;還是服務器出問題了?在本文中&#xff0c;我們將探討如何排除日本服務器 ping 請求故障&#xff0c;附帶常見原因及解決辦法。先搞清楚&#…