SpEL Validator 更新:支持国际化消息啦!
SpEL Validator,一个基于 Spring 表达式的参数校验框架,用起来有点像 jakarta.validation
,但语法更自由,表达力更强,支持各种复杂场景的参数校验。
这次 SpEL Validator 更新了一个实用又温柔的更新:支持国际化消息(i18n)啦!(当前版本v0.5.0-beta)
这意味着你可以:
- 让校验报错信息根据用户语言自动切换;
- 提供更符合业务场景的提示文案;
- 允许使用者自定义国际化资源,完全不入侵业务。
这篇文章就带大家快速过一遍 i18n 的用法,也会顺便再介绍一下 SpEL Validator 的基本能力,欢迎新老朋友都来坐坐。
SpEL Validator 是什么?
一句话介绍:SpEL Validator 是一个基于 Spring Expression Language 的轻量参数校验框架。
为什么要造这个轮子?因为用传统的 jakarta.validation
写复杂校验太麻烦了,比如你想校验一个字段的值要小于另一个字段,甚至是嵌套对象的某个字段,写起来就特别拧巴。
SpEL Validator 提供了一种更简洁的写法:
@SpelValid public class TimeRange { @SpelAssert(assertTrue = "#this.endTime > #this.startTime") private int startTime; private int endTime; }
是不是一目了然?只要你能用 SpEL 写出来,就能校验。
特性介绍
(已经了解过 SpEL Validator 的同学可以跳过这部分)
- 枚举值字段校验:
@SpelAssert(assertTrue = " T(cn.sticki.enums.UserStatusEnum).getByCode(#this.userStatus) != null ", message = "用户状态不合法") private Integer userStatus;
- 多字段联合校验:
@NotNull private Integer contentType; @SpelNotNull(condition = "#this.contentType == 1", message = "语音内容不能为空") private Object audioContent; @SpelNotNull(condition = "#this.contentType == 2", message = "视频内容不能为空") private Object videoContent;
- 复杂逻辑校验,调用静态方法:
// 中文算两个字符,英文算一个字符,要求总长度不超过 10 // 调用外部静态方法进行校验 @SpelAssert(assertTrue = "T(cn.sticki.util.StringUtil).getLength(#this.userName) <= 10", message = "用户名长度不能超过10") private String userName;
- 调用 Spring Bean(需要使用 @EnableSpelValidatorBeanRegistrar 开启Spring Bean支持):
// 这里只是简单举例,实际开发中不建议这样判断用户是否存在 @SpelAssert(assertTrue = "@userService.getById(#this.userId) != null", message = "用户不存在") private Long userId;
国际化消息怎么用?
在之前的版本中,message
字段,只能是写死的字符串,写的是什么就展示什么。
但从 v0.5.0-beta 起,message
支持国际化了!也就是说,你可以写成这样:
@SpelValid public class TimeRange { @SpelAssert(assertTrue = "#this.endTime > #this.startTime", message = "{validation.timerange.invalid}") private int startTime; private int endTime; }
其中 validation.timerange.invalid
是你的 message key。
内置资源文件
SpEL Validator 内置了一套国际化资源文件(从hibernate-validator的资源包里头copy过来的),支持多种语言,且默认启用。
设置区域信息
SpEL Validator 通过 Spring 提供的 LocaleContextHolder
来获取当前的区域设置。 默认情况下,它根据当前 request headers 的 Accept-Language
字段来确定区域。
如果你不使用这种方式来确定语言区域,可以通过 LocaleContextHolder.setLocale()
方法来手动更新区域(在校验执行之前更新)。
LocaleContextHolder.setLocale(Locale.CHINA);
自定义消息资源
如果需要自定义消息资源,只需将你的资源包添加到 SpEL Validator 的资源包列表中,假设你的资源包名称为 ValidationMessages
:
ResourceBundleMessageResolver.addBasenames("ValidationMessages");
它会将你的资源包添加到原有资源包列表的最前面,这意味着如果存在相同的key,会优先使用最后添加的资源包文件。你可以利用这一特性,来覆盖框架内部提供的默认message。
其他
更详细的国际化消息配置方式可参考在线文档:国际化指南
结语
虽然这次更新功能不多,但对很多实际使用场景来说都是非常友好的一步。特别是做支持多语言系统的同学,应该能感受到这个小升级的价值。
如果你还没用过 SpEL Validator,欢迎看看官方文档,有清晰的指南和案例。
如果你已经在用了,那快试试看 i18n 的新能力,给用户一条更温柔的提示吧 🐣
如果你觉得这个框架还不错,也欢迎给项目点个 ⭐️:https://github.com/stick-i/spel-validator
一起让参数校验这件小事,变得更轻松一点!

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
OurBMC大咖说 | 第10期:统信UOS操作系统,深度参与并赋能BMC技术发展
栏目介绍:"OurBMC大咖说"是一个由OurBMC社区精心策划的线上讲座栏目,每期邀请一位BMC相关领域大咖共同探讨BMC全栈技术的发展趋势、挑战和机遇。无论你是初学者还是资深从业者,"OurBMC大咖说"都将为你提供一个宝贵的学习和交流的平台。 快来关注"OurBMC大咖说"吧!让我们一起聆听大咖们的智慧之声,共同推动BMC全栈技术的进步和发展! 本期人物介绍:梅海鹏,统信软件有限公司 产研平台内核研发部研发经理,目前主要负责统信服务器操作系统内核研发, 先后参与并主导了统信 uos 服务器操作系统 V20 的 1050、1060、1070 版本的商用开发和发布,目前专注于内核高性能时延网络、高性能存储方面的研究和开发。 开源故事 开源的理解 在求学阶段,我便投身于Linux 嵌入式板级开发与内核裁剪工作。彼时,我对开源的理解尚处于浅层,仅将其视为可免费借用行业大牛现成代码、提升开发效率的途径。踏入职场后,尤其是加入统信并直接参与商用操作系统开发以来,我对开源有了全新且深刻的认识。 开源绝非简单的免费使用,它更强调参与与共享。各方力量汇聚于此,携手推动技术方向不断前进,并助力其在各...
- 下一篇
Keycloak 26.2.0 发布
Keycloak 26.2.0 现已发布,具体更新内容如下: 亮点 支持标准令牌交换 新版本添加了对标准令牌交换的支持。目前,这仅限于交换内部令牌为符合令牌交换规范的内部令牌。它尚未涵盖与身份代理或主体模拟相关的用例。后续版本将支持更多的令牌交换用例。 支持细粒度管理员权限 此版本引入了对新版细粒度管理员权限的支持。版本 2(V2)为领域内的管理访问提供了增强的灵活性和控制。借助此功能,管理员可以为用户、组、客户端和角色定义权限,而无需依赖广泛的管理角色。V2 为领域资源提供了与以前版本相同级别的访问控制,并计划在未来版本中扩展其功能。以下是一些关键点: 集中式管理控制台管理 - 新的权限部分允许从单个位置进行管理,而无需导航到管理控制台的不同位置。 改进的管理能力 - 管理员可以更轻松地搜索和评估权限,以为领域资源构建权限模型。 资源特定和全局权限 - 可以为单个资源(例如特定用户或组)或整个资源类型(例如所有用户或所有组)定义权限。 显式操作范围 - 权限现在是独立的,消除了操作之间的隐藏依赖。管理员必须显式分配每个范围,使得在不需要先前了解隐式关系的情况下,更容易查看授予的内容。...
相关文章
文章评论
共有0条评论来说两句吧...