👉 這是一個或許對你有用的社群
《專案實戰(影片)》:從書中學,往事上“練” 《網際網路高頻面試題》:面朝簡歷學習,春暖花開 《架構 x 系統設計》:摧枯拉朽,掌控面試高頻場景題 《精進 Java 學習指南》:系統學習,網際網路主流技術棧 《必讀 Java 原始碼專欄》:知其然,知其所以然

👉這是一個或許對你有用的開源專案國產 Star 破 10w+ 的開源專案,前端包括管理後臺 + 微信小程式,後端支援單體和微服務架構。功能涵蓋 RBAC 許可權、SaaS 多租戶、資料許可權、商城、支付、工作流、大屏報表、微信公眾號、ERP、CRM、AI 大模型等等功能:
Boot 多模組架構:https://gitee.com/zhijiantianya/ruoyi-vue-pro Cloud 微服務架構:https://gitee.com/zhijiantianya/yudao-cloud 影片教程:https://doc.iocoder.cn 【國內首批】支援 JDK 17/21 + SpringBoot 3.3、JDK 8/11 + Spring Boot 2.7 雙版本
一 前端 or 後端?
-
使用者體驗:前端校驗可以即時反饋給使用者,減少等待伺服器響應的時間,提高使用者體驗。 -
減輕伺服器負擔:透過前端校驗可以過濾掉一些明顯無效的請求,減少不必要的伺服器負載。
-
安全性:由於前端程式碼可以被繞過或修改。後端校驗是安全的必要保障,確保即使前端校驗被繞過,資料的安全性和完整性也能得到保證。 -
資料一致性:後端校驗可以確保所有透過的請求都符合業務邏輯和資料模型的要求,保持資料的一致性。 -
容錯性:後端校驗可以處理那些前端未能覆蓋到的異常情況,作為最後一道防線。 -
跨平臺一致性:後端校驗確保了無論使用者透過何種客戶端(Web、移動應用、第三方 API 等)訪問服務,資料校驗的標準都是一致的。 -
維護和可擴充套件性:後端校驗邏輯通常更容易維護和更新,因為它們集中在伺服器端,而不是分散在多個客戶端。 -
日誌和監控:後端可以記錄校驗失敗的請求,這對於監控系統安全和進行問題診斷非常有用。
基於 Spring Boot + MyBatis Plus + Vue & Element 實現的後臺管理系統 + 使用者小程式,支援 RBAC 動態許可權、多租戶、資料許可權、工作流、三方登入、支付、簡訊、商城等功能
專案地址:https://github.com/YunaiV/ruoyi-vue-pro 影片教程:https://doc.iocoder.cn/video/
二 引數校驗註解
2.1 引數校驗依據
@NotNull
、@Size
、@Email
等,用於校驗物件的屬性是否滿足特定的條件。@Email
的 message
屬性支援國際化,以及 @PositiveOrZero
、@NegativeOrZero
等。2.2 程式碼實踐
dependencies {
implementation
'org.springframework.boot:spring-boot-starter-validation'
implementation
'org.springframework.boot:spring-boot-starter-web'
testImplementation
'org.springframework.boot:spring-boot-starter-test'
testRuntimeOnly
'org.junit.platform:junit-platform-launcher'
}
publicclassUserDto
{
@NotNull
(message =
"使用者名稱不能為空"
)
private
String username;
@NotBlank
(message =
"密碼不能為空"
)
private
String password;
@NotEmpty
(message =
"郵箱不能為空"
)
private
String email;
//省略 getter/setter
public String getUsername()
{
return
username;
}
publicvoidsetUsername(String username)
{
this
.username = username;
}
public String getPassword()
{
return
password;
}
publicvoidsetPassword(String password)
{
this
.password = password;
}
public String getEmail()
{
return
email;
}
publicvoidsetEmail(String email)
{
this
.email = email;
}
}
@RestController
publicclassUserController
{
@GetMapping
(
"/hello"
)
public String hello(@Validated UserDto userDto, BindingResult bindingResult)
{
if
(bindingResult.hasErrors()) {
// 處理校驗失敗情況
}
return"200"
;
}
}
MethodArgumentNotValidException
異常。可以在全域性異常處理器中捕獲該異常並進行統一處理。@RestControllerAdvice
publicclassGlobalException
{
@ExceptionHandler
(MethodArgumentNotValidException
.
class
)
publicStringhandleValidationExceptions
(
MethodArgumentNotValidExceptionex
)
{
// 獲取校驗結果的錯誤資訊
String message = ex.getBindingResult().getAllErrors().get(
0
).getDefaultMessage();
return
message;
}
}
2.3 異常提示最佳化
messages.properties
檔案中定義異常提示文字,並在程式碼中透過 @Message
註解引用這些文字來實現國際化和自定義錯誤訊息。-
建立 messages.properties
檔案:在src/main/resources
目錄下建立一個messages.properties
檔案(對於不同語言版本,可以建立如messages_en.properties
、messages_fr.properties
等檔案)。 -
定義異常提示文字:在 messages.properties
檔案中定義鍵值對,鍵用於在程式碼中引用,值是實際的錯誤訊息。
NotEmpty.username=使用者名稱不能為空
NotBlank.password=密碼不能為空
Email.email=郵箱格式不正確
-
在實體類或 DTO 上使用校驗註解。
import
javax.validation.constraints.Email;
import
javax.validation.constraints.NotBlank;
import
javax.validation.constraints.NotNull;
import
org.hibernate.validator.constraints.NotEmpty;
publicclassUserDto
{
@NotNull
(message =
"{NotEmpty.username}"
)
private
String username;
@NotBlank
(message =
"{NotBlank.password}"
)
private
String password;
@Email
(message =
"{Email.email}"
)
private
String email;
// Getters and setters
}
-
配置國際化:如果你的應用需要支援多語言,可以在 application.properties
或application.yml
中配置訊息源。
spring.messages.basename=messages
spring.messages.encoding=UTF-
8
messages.properties
檔案中查詢對應的錯誤訊息,並將其返回給客戶端。這種方法不僅可以使錯誤訊息更加靈活和可維護,還可以方便地實現國際化。基於 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 實現的後臺管理系統 + 使用者小程式,支援 RBAC 動態許可權、多租戶、資料許可權、工作流、三方登入、支付、簡訊、商城等功能
專案地址:https://github.com/YunaiV/yudao-cloud 影片教程:https://doc.iocoder.cn/video/
三 什麼是分組校驗
假設我們有一個使用者實體User
,它包含使用者名稱、密碼和郵箱三個欄位。在使用者註冊時,我們需要校驗使用者名稱和密碼非空,郵箱格式正確。但在使用者資訊更新時,我們只需要校驗使用者名稱和郵箱,密碼可能不會被修改,因此不需要校驗。對於這種需求,我們可以使用分組校驗來實現這一需求。
publicinterfaceRegisterGroup
{}
publicinterfaceUpdateGroup
{}
User
實體上應用這些分組:import
javax.validation.constraints.Email;
import
javax.validation.constraints.NotBlank;
import
javax.validation.constraints.NotNull;
import
javax.validation.constraints.Size;
publicclassUser
{
@NotBlank
(message =
"使用者名稱不能為空"
, groups = {RegisterGroup
.
class
,
UpdateGroup
.
class
})
privateStringusername
;
@NotBlank
(message =
"密碼不能為空"
, groups = RegisterGroup
.
class
)
privateStringpassword
;
@Email
(message =
"郵箱格式不正確"
, groups = {RegisterGroup
.
class
,
UpdateGroup
.
class
})
privateStringemail
;
// Getters and setters
}
@Validated
註解並指定 RegisterGroup
分組:@RestController
publicclassUserController
{
@GetMapping
(
"/hello"
)
public String hello(@Validated UserDto userDto, BindingResult bindingResult)
{
if
(bindingResult.hasErrors()) {
// 處理校驗失敗情況
}
return"200"
;
}
@PostMapping
(
"/register"
)
public String register(@Validated(RegisterGroup.class) @RequestBody UserDto user)
{
// 註冊邏輯
return"註冊成功"
;
}
@PostMapping
(
"/update"
)
public String update(@Validated(UpdateGroup.class) @RequestBody UserDto user)
{
// 更新邏輯
return"更新成功"
;
}
}
User
物件會根據 RegisterGroup
分組進行校驗,而呼叫更新介面時,則會根據 UpdateGroup
分組進行校驗。這樣,我們就可以根據不同的業務需求來應用不同的校驗規則了。四 校驗註解






