国际化消息
自 v0.5.0-beta 版本起,SpEL Validator 提供了对校验消息的国际化支持。 通过配置资源文件和设置区域信息,您可以根据用户的语言环境返回相应的校验提示。
默认情况下,SpEL Validator 使用 cn.sticki.spel.validator.ValidationMessages
作为基础资源包。
以下内容将指导您如何配置您自己的国际化消息。
配置国际化资源文件
您需要在 resources
目录下创建对应的国际化资源文件(不限制资源包名称),例如:
ValidationMessages.properties
(默认语言)ValidationMessages_zh_CN.properties
(简体中文)ValidationMessages_en_US.properties
(美式英语)
每个文件中定义的键值对格式如下:
you.message.key.SpelNotNull=must not be null
添加自定义资源包
将您的资源包添加到 SpEL Validator 的资源包列表中:
ResourceBundleMessageResolver.addBasenames("ValidationMessages");
它会将 ValidationMessages
添加到原有资源包列表的最前面,这意味着如果存在相同的key,会覆盖掉原有的。
设置区域信息
SpEL Validator 通过 Spring 提供的 LocaleContextHolder
来获取当前的区域设置。 默认情况下,它会根据当前 request headers 的 Accept-Language
字段来确定区域。
您也可以通过 LocaleContextHolder.setLocale
方法来手动更新区域。
使用国际化消息键
在使用 SpEL Validator 提供的注解时,您可以通过 message
属性指定国际化消息的键。
@SpelNotNull(assertTrue = "true", message = "{you.message.key.SpelNotNull}")
private Integer age;
在校验失败时,系统将根据当前的区域设置,从资源文件中获取对应的消息。
转义特殊字符
在资源文件中,如果需要使用花括号 {}
或反斜杠 \
,请使用双反斜杠进行转义:
cn.sticki.spel.validator.constraint.Custom.message=值必须在 \\{1, 2, 3\\} 之中
SpEL Validator 会自动处理这些转义字符,确保消息正确显示。
示例
假设您有以下资源文件:
CustomValidationMessages.properties
:
cn.sticki.spel.validator.constraint.AssertTrue.message=must be true
CustomValidationMessages_zh_CN.properties
:
cn.sticki.spel.validator.constraint.AssertTrue.message=必须为 true
在程序启动后的某个时机添加资源包:
ResourceBundleMessageResolver.addBasenames("CustomValidationMessages");
在代码中使用:
@SpelAssert(assertTrue = "#this.active", message = "{cn.sticki.spel.validator.constraint.AssertTrue.message}")
private Boolean active;
根据当前的区域设置,校验失败时将返回相应语言的提示信息。