Spring Boot Validation支援JSR-380(aka. Bean Validation 2.0,part of Jakarta EE and JavaSE)註解,可透過驗證註解的message屬性設定驗證錯誤提示訊息,且每個驗證註解都有預設的message設定,例如@NotBlank
的message屬性值設定如下圖:
#預設的message = "{...}"
的形式即指定國際化屬性的名稱,後續會根據語言環境替換為對應的值,而這些國際化屬性的定義可參見hibernate-validator
中的org.hibernate.validator. ValidationMessages.properties
等一些列國際化屬性定義:
而我們在實際使用過程中,除了可以設定message="{propName}"
的形式來讀取國際化屬性,也可以直接設定值message="具體的提示訊息",而不明確設定message則使用先前提到的org.hibernate.validator.ValidationMessages.properties
中的預設配置。
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 Validation預設只支援讀取resources/ValidationMessages.properties
系列檔案的中的國際化屬性,且中文需要進行ASCII轉碼才可正確顯示
如下圖:
#而就算Spring Boot應用亦聲明了自身的國際化配置,但是Spring Boot Validation框架是讀取不到的
例如:
Spring Boot應用自身的國際化配置如下圖,但是在驗證註解message屬性設定i18n/messages.properties中的"{propName}"
是讀取不到的:
#而想要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系列
翻了Github上Spring Boot框架的Release說明,發現其在2021-08-20發布的v2.6.0-M2中提到了支援使用自身國際化MessageSource解析驗證提示訊息,也就是說Spring Boot 2.6.x版本之後已支援驗證註解message屬性引用Spring Boot自身國際化配置。
實際測試Spring Boot 2.6.x版本,驗證註解message="{propName}"
:
可以直接讀取透過spring.messages
設定的國際化配置中的屬性(設定UTF-8編碼後中文可無需ASCII轉碼),
同時也支援讀取resources
/ValidationMessages.properties
中的設定(中文需ASCII轉碼),
hibernate-validator的國際化文件。
以上是SpringBoot Validation提示訊息國際化如何配置的詳細內容。更多資訊請關注PHP中文網其他相關文章!