SpringBoot?Validation提示信息國際化配置方式
引言
之前介紹過Spring Boot Validation的使用及擴展
本文在此基礎上重點講解下Spring Boot Validation如何集成國際化。
Spring Boot Validation支持JSR-380(aka. Bean Validation 2.0,part of Jakarta EE and JavaSE)注解,可通過驗證注解的message屬性設置驗證錯誤提示信息,且每個驗證注解都有默認的message配置,例如@NotBlank的message屬性值設置如下圖:

默認的message = "{...}"的形式即指定國際化屬性的名稱,后續(xù)會根據(jù)語言環(huán)境替換為對應的值,而這些國際化屬性的定義可參見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中進行配置的國際化屬性才會生效,而后續(xù)在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轉碼才可正確顯示
如下圖:

而就算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設置的國際化文件和原h(huán)ibernate-validator的國際化文件
//不支持resource/ValidationMessages.properties系列
bean.setValidationMessageSource(this.messageSource);
return bean;
}
}
注:
- 通過上述配置類進行配置后,
- 僅兼容Spring Boot spring.messages設置的國際化文件和原h(huán)ibernate-validator的國際化文件
- 不再支持resource/ValidationMessages.properties系列
Spring Boot 2.6.x
翻了Github上Spring Boot框架的Release說明,發(fā)現(xiàn)其在2021-08-20發(fā)布的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的國際化文件。
且讀取優(yōu)先級依次從上到下,即最上面的優(yōu)先生效。
具體的配置及使用方式見下圖:

Spring Boot 2.6關于Spring Boot Validation與MessageSource的融合,具體實現(xiàn)細節(jié)可參見Release中提到的GitHub Pull Request #17530:

參考:
- https://github.com/spring-projects/spring-boot/releases/tag/v2.6.0-M2
- https://github.com/spring-projects/spring-boot/pull/17530
- https://github.com/spring-projects/spring-boot/pull/17530/commits/0cbb3465386484f3ca27c3d7842f000acfa5e335
- https://stackoverflow.com/questions/45692179/spring-boot-validation-message-is-not-being-resolved
總結
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
java wait()/notify() 實現(xiàn)生產(chǎn)者消費者模式詳解
這篇文章主要介紹了java wait()/notify() 實現(xiàn)生產(chǎn)者消費者模式詳解,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-07-07
Java 在Word中創(chuàng)建郵件合并模板并合并文本和圖片的操作方法
通過Java程序展示如何來實現(xiàn)創(chuàng)建模板,并通過郵件合并功能來合并文本數(shù)據(jù)和圖片數(shù)據(jù)的方法,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧2021-07-07
實例講解Java的Spring框架中的AOP實現(xiàn)
這篇文章主要介紹了Java的Spring框架中的AOP實現(xiàn)實例,AOP面向切面編程其實也可以被看作是一個設計模式去規(guī)范項目的結構,需要的朋友可以參考下2016-04-04

