首頁 > Java > java教程 > 主體

SpringBoot Validation提示訊息國際化如何配置

PHPz
發布: 2023-05-11 11:43:05
轉載
1402 人瀏覽過

Spring Boot Validation支援JSR-380(aka. Bean Validation 2.0,part of Jakarta EE and JavaSE)註解,可透過驗證註解的message屬性設定驗證錯誤提示訊息,且每個驗證註解都有預設的message設定,例如@NotBlank的message屬性值設定如下圖:

SpringBoot Validation提示訊息國際化如何配置

#預設的message = "{...}"的形式即指定國際化屬性的名稱,後續會根據語言環境替換為對應的值,而這些國際化屬性的定義可參見hibernate-validator中的org.hibernate.validator. ValidationMessages.properties等一些列國際化屬性定義:

SpringBoot Validation提示訊息國際化如何配置

而我們在實際使用過程中,除了可以設定message="{propName}" 的形式來讀取國際化屬性,也可以直接設定值message="具體的提示訊息",而不明確設定message則使用先前提到的org.hibernate.validator.ValidationMessages.properties中的預設配置。

SpringBoot Validation提示訊息國際化如何配置

Spring Boot Validation起初其並不直接支援讀取Spring Boot自身的國際化配置(透過spring.messages進行配置),而是需要在resources/ValidationMessages. properties中進行配置的國際化屬性才會生效,而後續在Spring Boot 2.6 版本才支援Validation與Spring Boot本身的國際化配置結合。

接下來結合Spring Boot 2.5和2.6版本分別介紹下Spring Boot Validation如何整合自訂國際化驗證提示資訊。

Spring Boot 2.5.x

在Spring Boot 2.5.x版本中,Spring Boot Validation預設只支援讀取resources/ValidationMessages.properties系列檔案的中的國際化屬性,且中文需要進行ASCII轉碼才可正確顯示

如下圖:

SpringBoot Validation提示訊息國際化如何配置

#而就算Spring Boot應用亦聲明了自身的國際化配置,但是Spring Boot Validation框架是讀取不到的

例如:

Spring Boot應用自身的國際化配置如下圖,但是在驗證註解message屬性設定i18n/messages.properties中的"{propName}"是讀取不到的:

SpringBoot Validation提示訊息國際化如何配置

#而想要Spring Boot Validation框架和Spring Boot自身使用同樣的國際化配置,則可透過以下方式進行配置:

import org.springframework.context.MessageSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.validation.Validator;
import org.springframework.validation.beanvalidation.LocalValidatorFactoryBean;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

/**
 * Spring Web验证器自定义国际化文件配置<br/>
 * 注:适用于Spring Boot 2.5.*
 *
 * @author luohq
 * @date 2022-05-21
 */
@Configuration
public class WebValidationConfig implements WebMvcConfigurer {

    /**
     * 国际化消息源
     */
    private MessageSource messageSource;

    public WebValidationConfig(MessageSource messageSource) {
        //注入Spring Boot国际化消息源(需通过spring.messages明确指定)
        this.messageSource = messageSource;
    }

    /**
     * 使用自定义LocalValidatorFactoryBean,
     * 设置Spring国际化消息源
     */
    @Bean
    @Override
    public Validator getValidator() {
        LocalValidatorFactoryBean bean = new LocalValidatorFactoryBean();
        //仅兼容Spring Boot spring.messages设置的国际化文件和原hibernate-validator的国际化文件
        //不支持resource/ValidationMessages.properties系列
        bean.setValidationMessageSource(this.messageSource);
        return bean;
    }

}
登入後複製

#註:

  • #透過上述配置類別進行配置後,

  • 僅相容於Spring Boot spring.messages設定的國際化檔案和原hibernate-validator的國際化檔案

  • 不再支援resource/ValidationMessages.properties系列

Spring Boot 2.6.x

翻了Github上Spring Boot框架的Release說明,發現其在2021-08-20發布的v2.6.0-M2中提到了支援使用自身國際化MessageSource解析驗證提示訊息,也就是說Spring Boot 2.6.x版本之後已支援驗證註解message屬性引用Spring Boot自身國際化配置。

SpringBoot Validation提示訊息國際化如何配置

實際測試Spring Boot 2.6.x版本,驗證註解message="{propName}"

  • 可以直接讀取透過spring.messages設定的國際化配置中的屬性(設定UTF-8編碼後中文可無需ASCII轉碼),

  • 同時也支援讀取resources/ValidationMessages.properties中的設定(中文需ASCII轉碼),

  • ##且依舊支援原

    hibernate-validator的國際化文件。

且讀取優先權依序從上到下,也就是最上面的優先權生效。

具體的配置及使用方式請見下圖:

SpringBoot Validation提示訊息國際化如何配置

Spring Boot 2.6關於Spring Boot Validation與MessageSource的融合,具體實作細節可參考Release中提到的GitHub Pull Request #17530:

SpringBoot Validation提示訊息國際化如何配置

以上是SpringBoot Validation提示訊息國際化如何配置的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:yisu.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板