1. 概述
我們經常面臨設計應用程序,需要在多語言環境中傳遞本地化消息的任務。在這種情況下,將消息傳遞給用户的選擇語言是一種常見的做法。
當收到客户端對 REST Web 服務的請求時,我們必須確保傳入的客户端請求在處理之前滿足預定義的驗證規則。驗證旨在保持數據完整性和增強系統安全性。服務負責提供信息性消息,指示請求驗證失敗時發生的情況。
在本教程中,我們將探討在 REST Web 服務中實現本地化驗證消息的實現。
2. 關鍵步驟
我們的旅程從使用資源包作為存儲本地化消息的倉庫開始。然後,我們將資源包與 Spring Boot 集成,從而能夠在我們的應用程序中檢索本地化消息。
接下來,我們將創建一個包含請求驗證的 Web 服務,這展示了在請求驗證錯誤發生時如何利用本地化消息。
最後,我們將探索不同類型的本地化消息自定義選項。這些選項包括覆蓋默認驗證消息、定義自己的資源包以提供自定義驗證消息,以及創建自定義驗證註解以實現動態消息生成。
通過這些步驟,我們將深入理解如何在多語言應用程序中提供精確且語言特定的反饋。
3. Maven 依賴
在開始之前,我們先添加 Spring Boot Starter Web 和 Spring Boot Starter Validation 依賴,用於 Web 開發和 Java Bean 驗證,添加到 <pom.xml> 中:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>最新版本的這些內容可以在 Maven Central 上找到。
4. 本地化消息存儲
在 Java 應用開發中,屬性文件通常用作國際化應用中本地化消息的存儲庫。 採用這種方法被認為是約定俗成的做法。 這些文件通常被稱為資源包。
這些文件是包含鍵值對的純文本文檔。 鍵作為消息檢索的標識符,而關聯的值則包含相應語言中的本地化消息。
在本教程中,我們將創建兩個屬性文件。
CustomValidationMessages.properties 是我們的默認屬性文件,文件名不包含任何區域設置名稱。 當客户端指定不支持的區域設置時,應用程序始終回退到其默認語言:
field.personalEmail=Personal Email
validation.notEmpty={field} cannot be empty
validation.email.notEmpty=Email cannot be empty我們希望創建一個額外的中文語言屬性文件,即 CustomValidationMessages_zh.properties。應用程序在客户端指定 zh 或諸如 zh-tw 之類的 locale 時,會切換到中文。
field.personalEmail=個人電郵
validation.notEmpty={field}不能是空白
validation.email.notEmpty=電郵不能留空必須確保所有屬性文件都使用 UTF-8 編碼。這在處理包含非拉丁字符(如中文、日語和韓語)的消息時尤其重要。 這種保證將確保我們能夠準確顯示所有消息,而無需擔心數據損壞的風險。
5. 本地化消息檢索
Spring Boot 通過 <em data-renderer-mark="true">MessageSource</em> 接口簡化了本地化消息檢索。它從應用程序的資源包中解析消息,並允許我們無需額外努力獲取不同區域的語言信息。
必須在 Spring Boot 中配置 <em data-renderer-mark="true">MessageSource</em> 的提供者,才能使用它。在本教程中,我們將 <em data-renderer-mark="true">ReloadableResourceBundleMessageSource</em> 作為實現方式。
它能夠重新加載消息屬性文件,而無需重啓服務器。這在應用程序初始開發階段非常有用,此時我們希望在不重新部署整個應用程序的情況下看到消息更改。
必須將默認編碼與我們用於屬性文件的 UTF-8 編碼對齊:
@Configuration
public class MessageConfig {
@Bean
public MessageSource messageSource() {
ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
messageSource.setBasename("classpath:CustomValidationMessages");
messageSource.setDefaultEncoding("UTF-8");
return messageSource;
}
}6. Bean 驗證
在驗證過程中,使用一個名為 User 的數據傳輸對象 (DTO),其中包含一個 email 字段。我們將使用 Java Bean 驗證來驗證此 DTO 類。 email 字段使用 @NotEmpty 註解,以確保它不是一個空字符串。 此註解是標準的 Java Bean 驗證註解:
public class User {
@NotEmpty
private String email;
// getters and setters
}7. RESTful 服務
在本節中,我們將創建一個 RESTful 服務,名為 <em data-renderer-mark="true">UserService</em>,該服務負責通過 PUT 方法根據請求體更新特定用户的信息。
@RestController
public class UserService {
@PutMapping(value = "/user", produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<UpdateUserResponse> updateUser(
@RequestBody @Valid User user,
BindingResult bindingResult) {
if (bindingResult.hasFieldErrors()) {
List<InputFieldError> fieldErrorList = bindingResult.getFieldErrors().stream()
.map(error -> new InputFieldError(error.getField(), error.getDefaultMessage()))
.collect(Collectors.toList());
UpdateUserResponse updateResponse = new UpdateUserResponse(fieldErrorList);
return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(updateResponse);
}
else {
// Update logic...
return ResponseEntity.status(HttpStatus.OK).build();
}
}
}7.1. 地區選擇
使用 Accept-Language HTTP 標頭來定義客户端的語言偏好是很常見的做法。
我們可以通過在 Spring Boot 中使用