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

一起让参数校验这件小事,变得更轻松一点!


相關推薦

2024-09-21

套几乎可以满足任何场景的参数校验组件,名为 SpEL Validator ,安利给大家。 GitHub:https://github.com/stick-i/spel-validator 官方文档:https://spel-validator.sticki.cn/ 💡 它解决了什么问题? 枚举值字段校验: @SpelAssert(assertTru

2024-07-10

验框架 采用 Validation 支持注解与工具类校验 注解支持国际化 仅支持注解 且注解不支持国际化 Excel框架 采用 Alibaba EasyExcel 基于插件化 框架对其增加了很多功能 例如 自动合并相同内容 自动排列布局 字典翻译等 基于

2024-08-22

支持 错误处理: 优化错误信息处理, 支持多语言错误 Validator: 简单易用的校验器, 只需添加 tag 即可校验 三端代码生成: 支持三端代码生成,生成 API, RPC 和 web 端的 CRUD 代码 RPC 接口分组: rpc logic group 分组 proto 文件拆分:

2024-07-30

支持 错误处理: 优化错误信息处理, 支持多语言错误 Validator: 简单易用的校验器, 只需添加 tag 即可校验 三端代码生成: 支持三端代码生成,生成 API, RPC 和 web 端的 CRUD 代码 RPC 接口分组: rpc logic group 分组 proto 文件拆分:

2024-07-16

支持 错误处理: 优化错误信息处理, 支持多语言错误 Validator: 简单易用的校验器, 只需添加 tag 即可校验 三端代码生成: 支持三端代码生成,生成 API, RPC 和 web 端的 CRUD 代码 RPC 接口分组: rpc logic group 分组 proto 文件拆分:

2024-06-26

支持 错误处理: 优化错误信息处理, 支持多语言错误 Validator: 简单易用的校验器, 只需添加 tag 即可校验 三端代码生成: 支持三端代码生成,生成 API, RPC 和 web 端的 CRUD 代码 RPC接口分组: rpc logic group 分组 proto文件拆分: 支

2024-04-24

们的资产情况,更好地进行管理和保护啦!🔍 📝版本更新内容: 🎁 新增Docker Compose 部署文件 📢 新增Jenkins构建通知,支持接入企业微信消息推送机器人 🕵️ 新增KScan资产测绘能力 希望我的新技能能够帮助到你们

2022-09-26

ct 和 ?object 返回类型 修复了 Phalcon\\\\Filter\\\\Validation\\\\Validator\\\\Digit ,以在调用 ctype_* 时只使用字符串 修复了 Phalcon\\\\Flash\\\\AbstractFlash::outputMessage 返回消息 修复了 Phalcon\\\\Filter\\\\Validation\\\\Validator\\\\Numericality,以正确

2024-09-27

warm-flow 1.2.8版本更新,新增办理人变量表达式和条件表达式支持spel 【升级注意事项】 本次升级,内置json库snack3方式,改为spi方式加载,业务项目中存在哪种json就会使用哪种的实现, 支持顺序按顺序加载一种:snack3、jacks

2024-07-13

考虑InputStreamResource的子类 #33089 改进有关 FreeMarker 支持中的编码的文档 #33071 WebFlux 中验证失败的异常与文档不匹配 #33061 Dependency Upgrades 升级到 Kotlin 1.9.24 #33177 升级到 Kotlin Serialization 1.6.3 #33175 升级

2024-08-27

验框架 采用 Validation 支持注解与工具类校验 注解支持国际化 仅支持注解 且注解不支持国际化 Excel框架 采用 Alibaba EasyExcel 基于插件化 框架对其增加了很多功能 例如 自动合并相同内容 自动排列布局 字典翻译等 基于

2023-11-28

验框架 采用 Validation 支持注解与工具类校验 注解支持国际化 仅支持注解 且注解不支持国际化 Excel框架 采用 Alibaba EasyExcel 基于插件化 框架对其增加了很多功能 例如 自动合并相同内容 自动排列布局 字典翻译等 基于

2023-04-01

TypeScript 的 TinyNG 组件库,包含丰富的组件,支持国际化、主题定制,涉及大数据的组件,已内置虚拟滚动,保持丝滑稳定,并提供企业级安全保障,所有接口杜绝 XSS 攻击。TinyNG 采用面向对象架构设计,代码重复率远低

2024-03-30

新功能 升级Nginx core到1.25.3,主要更新有:修复已知bug,支持http3功能,TLSv1.3默认支持,优化mp4与gzip功能等 升级Openresty core到Version 1.25.3.1 ,主要更新有 支持pcre2 支持lua_ssl_certificate和 lua_ssl_certificate_key(不支持国密证