SpringBoot Validation提示信息国际化配置方式
作者:罗小爬EX 发布时间:2021-08-21 09:27:32
引言
之前介绍过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 = "{...}"
的形式即指定国际化属性的名称,后续会根据语言环境替换为对应的值,而这些国际化属性的定义可参见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 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系列
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自身国际化配置。
实际测试Spring Boot 2.6.x版本,验证注解message="{propName}"
:
可以直接读取通过
spring.messages
设置的国际化配置中的属性(设置UTF-8编码后中文可无需ASCII转码),同时亦支持读取
resources
/ValidationMessages.properties
中的配置(中文需ASCII转码),且依旧支持原
hibernate-validator
的国际化文件。
且读取优先级依次从上到下,即最上面的优先生效。
具体的配置及使用方式见下图:
Spring Boot 2.6关于Spring Boot Validation与MessageSource的融合,具体实现细节可参见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
来源:https://blog.csdn.net/luo15242208310/article/details/124897389


猜你喜欢
- 前言碎语今天博主安利一个国产开源的无服务器容器云平台,关注它已经有一年多了,虽然其迭代到现在很多功能还是一直处于测试验证中,但是其设计理念以
- 树的结构说得差不多了,现在我们来说说一种数据结构叫做哈希表(hash table),哈希表有是干什么用的呢?我们知道树的操作的时间复杂度通常
- 注:由于工作需要, 也是第一次接触到打印机的相关内容, 凑巧, 通过找了很多资料和帮助后, 也顺利的解决了打印标签的问题(标签的表面信息[二
- 最近在做关于PDF文档添加水印的功能,折腾了好久,终于好了。以下做个记录:首先会用到iTextSharp组件,大家可以去官网下载,同时我也会
- 1.在action中定义变量 private List<String> downLoadPaths = new ArrayLis
- Service的生命周期 (适用于2.1及以上)1. 被startService的无论是否有任何活动绑定到该Service,都在后台运行。o
- 多态是同一个行为具有多个不同表现形式或形态的能力。多态性意味着有多重形式。在面向对象编程范式中,多态性往往表现为"一个接口,多个功
- 防止程序运行多个实例的方法有多种,如:通过使用互斥量和进程名等.而我想要实现的是:在程序运行多个实例时激活的是第一个实例,使其获得焦点,并在
- 本文将反射的东西整理了一下 , 提供了最全面的东西 , 当然也是基础的东西 ,在学好了这一切的基础上 , 大家可以学习反射的具体插件等应用
- C++的 bitset 在 bitset 头文件中,它是一种类似数组的结构,它的每一个元素只能是0或1,每个元素仅用1bit空间。下面是具体
- 本文实例讲述了Android编程设计模式之Builder模式。分享给大家供大家参考,具体如下:一、介绍Builder模式是一步一步创建一个复
- 主要介绍:1.任务队列2.拒绝策略(抛出异常、直接丢弃、阻塞、临时队列)3.init( min )4.active5.maxmin<=
- 前言在上一篇 Spring boot + LayIM + t-io 文件上传、 监听用户状态的实现 中,已经介绍了两个小细节:用户的在离线状
- 首先我们看看为什么添加Watch。ZooKeeper是用来协调(同步)分布式进程的服务,提供了一个简单高性能的协调内核,用户可以在此之上构建
- 加载yml配置文件的no字段自动转义项目上线了才发现一个字段被转义了,如下图:本来应该会拿到no字段和数据进行比对的,结果发现比对完的数据这
- springboot 统一设置时区控制springboot服务的时区为东八区@SpringBootApplicationpublic cla
- 适合人群学完Java基础想通过Java快速构建web应用程序想学习或了解SpringBoot背景本节给大家讲讲 Java的Spri
- 先看看效果: 首先,导入包:compile files('libs/nineoldandroids-2.4.0.jar')r
- Android游戏开发中主要的类除了控制类就是显示类,
- 什么是接口:接口是一系列方法的声明,是一些方法特征的集合注意:在接口中只有方法名,没有方法体!关键字:interface(创建接口), im