知識庫 / Spring / Spring Boot RSS 訂閱

在 Spring 中綁定自定義驗證消息

Spring Boot
HongKong
11
10:36 AM · Dec 06 ,2025

1. 簡介

企業級Java開發高度依賴Spring框架。它是一個強大的框架,可以簡化構建健壯、可擴展應用程序的過程。 我們可以使用Spring構建REST API、微服務或全棧Web應用程序,實現高效、簡潔。

然而,隨着應用程序規模的擴大,清晰易懂的驗證變得至關重要。自定義驗證消息可以解決這個問題。開發人員可以使用它們向用户提供有用的反饋,而不是混亂的錯誤信息。

在本教程中,我們將討論Spring Boot的驗證消息系統,如何有效地配置它,簡化錯誤處理,並使消息管理更加直觀。

2. 自定義驗證消息綁定

為了引導用户並保證數據完整性,驗證至關重要。Spring Boot 使用 Java Bean 驗證框架 (JSR-380),允許開發者通過註解將字段與約束(如 @NotBlank@Email@Min)關聯。

然而,為了提高本地化和可維護性,我們可以將錯誤消息綁定到外部屬性,而不是硬編碼。

2.1. 添加驗證依賴

為了在我們的 Spring Boot 應用程序中使用 validation 註解,我們需要包含 Spring Boot Starter Validation 依賴項。該啓動器封裝了 Hibernate Validator,它是 Bean Validation API (JSR-380) 的參考實現。

對於 Maven 配置,我們將以下內容添加到我們的 pom.xml

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-validation</artifactId>
</dependency>

一旦添加,Spring Boot 將會自動添加必要的組件以支持我們應用程序的驗證,包括 REST 控制器、服務層和表單輸入。

2.2. 標註 DTO 及其消息鍵

在配置驗證依賴後,我們應該為數據傳輸對象 (DTO) 添加註解,以對傳入的數據施加規則。

根據我們的配置,這些註解包含在 jakarta.validation.constraintsjavax.validation.constraints 包中。

讓我們使用約束註解並引用消息鍵:

public class UserDTO {
    @NotBlank(message = "{user.name.notblank}")
    private String name;
    @Email(message = "{user.email.invalid}")
    private String email;
    @Min(value = 18, message = "{user.age.min}")
    private int age;
    // Getters and setters
}

@NotBlank 驗證“姓名”字段是否為空或為 null。@Email 驗證“電子郵件”字段的格式,@Min 驗證個人是否至少十八歲。

我們將使用消息鍵,如 user.name.notblank,來傳遞錯誤消息,而不是直接將它們硬編碼到註解中(例如,message = “Name must not be blank”)。

在下一步中,我們將使用這些鍵來自一個屬性文件(ValidationMessages.properties)。

2.3. 創建和結構驗證消息

現在我們將創建驗證消息。 Spring Boot 自定義驗證消息的核心是 ValidationMessages.properties 文件。它允許我們將錯誤消息從代碼中分離出來,從而實現更簡潔的邏輯、更簡單的維護以及支持本地化。

我們需要將該文件放置在項目的目錄路徑中:

our-project/
└── src/
└── main/
└── resources/
└── ValidationMessages.properties

Spring Boot 會自動檢測此文件,前提是文件名正確且位於 classpath 中。

文件中每一條條目都將一個可讀的文本消息與一個消息鍵關聯起來,我們將使用此鍵在我們的 DTO 註解中,如示例所示:

# ValidationMessages.properties
user.name.notblank=Name must not be blank.
user.email.invalid=Please provide a valid email address.
user.age.min=Age must be at least 18.

這些鍵與 DTO 中的 message 屬性對應。

@NotBlank(message = "{user.name.notblank}")
@Email(message = "{user.email.invalid}")
@Min(value = 18, message = "{user.age.min}")

3. 可選消息源配置

默認情況下,Spring Boot 從 classpath 上的 <em >ValidationMessages.properties</em> 加載驗證消息。

例如,如果我們想要支持多種語言、更改編碼或使用不同的文件名,我們可以顯式配置 <em >MessageSource</em> Bean。 以下步驟是可選的,但強烈建議採用:

  • 國際化 (I18n) – 支持多個區域
  • 自定義文件命名 – 使用 `messages.properties` 或其他名稱
  • 高級控制 – 配置回退行為、編碼等

3.1. 消息來源是什麼?

這個 Spring 接口通過在 .properties 文件中指定鍵和區域設置來檢索消息。它是 Spring 的 i18n(國際化)和驗證消息系統的主組件。

要配置 MessageSource,我們將向我們的 Spring Boot 應用程序類或配置類添加以下 Bean:

@Bean
public MessageSource messageSource() {
    ResourceBundleMessageSource source = new ResourceBundleMessageSource();
    source.setBasename("ValidationMessages");     // Name of your properties file (without .properties)
    source.setDefaultEncoding("UTF-8");           // Ensures proper character encoding
    source.setUseCodeAsDefaultMessage(true);      // Optional: fallback to key if message not found
    return source;
}

以下是關鍵屬性和用途:

屬性 用途
setBasename(“…”) 指定消息文件的基本名稱(例如,ValidationMessages)
setDefaultEncoding(“UTF-8”) 確保特殊字符和非英語文本的正確顯示
setUseCodeAsDefaultMessage() 如果未找到消息,則回退到鍵(對調試有幫助)

3.2. 支持多種語言

為了支持國際用户,我們將創建特定於區域的文件:

src/main/resources/
├── ValidationMessages_en.properties
├── ValidationMessages_fr.properties
├── ValidationMessages_ar.properties

Spring 會自動根據用户的區域設置(locale)確定合適的配置文件,該區域設置可以通過瀏覽器偏好設置、HTTP 頭部和配置進行設置。

例如,對於法語本地化,使用 ValidationMessages_fr.properties

4. 在控制器中驗證

下一步是在我們使用驗證約束並綁定自定義消息對 DTO 進行註釋後,在我們的控制器中啓動驗證並優雅地處理錯誤。

通過使用 標註和 BindingResult 接口,Spring Boot 使這變得容易。 讓我們討論一個接受 UserDTO 對象的 REST 控制器方法,並對其進行驗證:

@PostMapping("/register")
public ResponseEntity<?> registerUser(@Valid @RequestBody UserDTO userDTO, BindingResult result) {
    if (result.hasErrors()) {
        List<String> errors = result.getFieldErrors()
          .stream()
          .map(FieldError::getDefaultMessage)
          .collect(Collectors.toList());
        return ResponseEntity.badRequest().body(errors);
    }
    // Proceed with registration logic
    return ResponseEntity.ok("User registered successfully");
}

以下表格詳細説明了上述代碼中每個組件的作用:

組件作用
@Valid在傳入的 UserDTO 對象上觸發驗證
BindingResult捕獲驗證錯誤(如果有)
FieldError表示單個字段級別的錯誤
getDefaultMessage()從 ValidationMessages.properties 中檢索自定義消息

4.1. 使用 BindingResult 的原因?

Spring 在我們沒有使用 BindingResult 時會拋出錯誤。雖然這種方式可以工作,但對於修改錯誤格式、多錯誤聚合或生成結構化 JSON 響應,這並不是最佳選擇。

當我們使用 BindingResult 時,我們完全掌控錯誤處理和顯示的方式。

例如,當用户提供不準確的數據時,控制器可能會返回以下 JSON 錯誤響應:

[
"Name must not be blank.",
"Please provide a valid email address.",
"Age must be at least 18."
]

這是一個乾淨、易讀且直接與自定義消息相關聯的內容。

5. 結論

在本文中,我們討論瞭如何在 Spring Boot 中綁定自定義驗證消息,從而簡化用户反饋。 這通過將錯誤消息外部化到屬性文件中實現。

此外,我們詳細闡述瞭如何通過幾個簡單的步驟創建清晰、易於維護且用户友好的驗證流程。 這包括添加驗證依賴項、註釋 DTO、配置消息源以及在控制器中處理錯誤。

這種方法進一步促進了本地化和可擴展的應用程序設計,同時增加了清晰度。

測試代碼可在 GitHub 上獲取

user avatar
0 位用戶收藏了這個故事!
收藏

發佈 評論

Some HTML is okay.