【收藏!!!】Springboot國際化信息(i18n)解析

國際化信息理解

國際化信息也稱為本地化信息 。 Java 通過 java.util.Locale 類來表示本地化對象,它通過 “語言類型” 和 “國家/地區” 來創建一個確定的本地化對象 。舉個例子吧,比如在發送一個具體的請求的時候,在header中設置一個鍵值對:"Accept-Language":"zh",通過Accept-Language對應值,服務器就可以決定使用哪一個區域的語言,找到相應的資源文件,格式化處理,然后返回給客戶端。

MessageSource

Spring 定義了 MessageSource 接口,用于訪問國際化信息。

getMessage(String code, Object[] args, String defaultMessage, Locale locale)

getMessage(String code, Object[] args, Locale locale)

getMessage(MessageSourceResolvable resolvable, Locale locale)


?MessageSourceAutoConfiguration

?springboot提供了國際化信息自動配置類,配置類中注冊了ResourceBundleMessageSource實現類。

首先MessageSource配置生效依靠一個ResourceBundleCondition條件,從環境變量中讀取spring.messages.basename對應的值,默認值是messages,這個值就是MessageSource對應的資源文件名稱,資源文件擴展名是.properties,然后通過PathMatchingResourcePatternResolver從“classpath*:”目錄下讀取對應的資源文件,如果能正常讀取到資源文件,則加載配置類。

?springmvc自動裝配配置類,注冊了一個RequestContextFilter過濾器。

?每一次請求,LocaleContextHolder都會保存當前請求的本地化信息。

?通過MessageSourceAccessor根據code獲取具體信息時,如果默認配置的本地化對象為空,則通過LocaleContextHolder獲取。

?上圖的messageSource是應用程序上下文對象(本文創建的是GenericWebApplicationContext實例),該messageSource對象會調用ResourceBundleMessageSource實例獲取具體信息。

ValidationAutoConfiguration

參數校驗hibernate-validator是通過這個自動裝配加載進來的。

MethodValidationPostProcessor這個后置處理處理方法里單個參數校驗的注解(JSR和Hibernate validator的校驗只能對Object的屬性(也就是Bean的域)進行校驗,不能對單個的參數進行校驗。)。

LocalValidatorFactoryBean實現了javax.validation.ValidatorFactory和javax.validation.Validator這兩個接口,以及Spring的org.springframework.validation.Validator接口,你可以將這些接口當中的任意一個注入到需要調用驗證邏輯的Bean里。

?默認情況下,LocalValidatorFactoryBean創建的validator使用PlatformResourceBundleLocator獲取資源的綁定關系,獲取的資源名稱是:ValidationMessages

?用戶自定義的校驗信息放在項目classpath目錄下。

另外hibernate-validator還會加載默認的校驗資源文件,名稱是:org.hibernate.validator.ValidationMessages。可以看到,默認的校驗資源捆綁文件包含了不同區域的信息的配置。

通過LocalValidatorFactoryBean獲取的validator是如何根據不同的地區加載不同校驗資源文件呢?hibernate-validator暴露了一個消息插補器(MessageInterpolator),spring正是重新代理這個消息插補器。

?通過LocaleContextMessageInterpolator源碼,可以看到最終還是通過LocaleContextHolder獲取當前時區信息。

是否可以自定義國際化校驗的資源信息呢?當然是肯定的,我們只需要重寫LocalValidatorFactoryBean類型bean的創建過程,通過setValidationMessageSource方法指定自定義的資源信息。

MessageSource測試

基礎測試

建立Resouce bundle messages

編寫message source測試方法,從request中獲取當前Locale值

?編寫測試類,指定當前請求的Locale值或者設置請求頭的header值:Accept-Language:zh

根據測試類中請求的Locale值不同,獲取到的文本也不同。

格式化測試

建立Resouce bundle messages

編寫message source測試方法,從request中獲取當前Locale值

?編寫測試類,指定當前請求的Locale值或者設置請求頭的header值:Accept-Language:zh

根據測試類中請求的Locale值不同,獲取到的格式化的文本也不同。

靜態message source測試

動態注冊message(可區分Locale),可用于自定義message source。

編寫測試的方法,通過MessageSourceAccessor訪問。

?編寫測試類,獲取自定義message source中的信息。

根據測試類中請求的Locale值不同,獲取到的文本也不同。

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容