Hibernate Validator如何从Properties加载注解默认消息?
Hibernate Validator注解默认消息加载机制解析
示例代码与配置
先看你给出的注解定义和资源配置:
注解代码
package org.hibernate.validator.constraints; ... public @interface CreditCardNumber { String message() default "{org.hibernate.validator.constraints.CreditCardNumber.message}"; ... }
资源文件配置(通常是类路径下的ValidationMessages.properties)
org.hibernate.validator.constraints.CreditCardNumber.message = invalid credit card number
具体实现流程
Hibernate Validator是通过一套约定+消息插值机制来实现这个功能的,核心步骤如下:
注解占位符约定:注解里
message()的默认值用{}包裹的字符串,是Hibernate Validator识别的消息键占位符,告诉Validator这个值不是直接使用的文本,而是要去资源文件中查找对应的真实消息。默认资源文件加载:Validator会自动扫描类路径下的标准资源文件,默认是
ValidationMessages.properties(如果要支持国际化,还可以放置ValidationMessages_zh_CN.properties这类本地化文件),你示例里的键值对就放在这类文件中。消息插值解析:当Validator执行验证逻辑时,会读取注解的
message属性:- 识别到属性值是带
{}的占位符,就会调用MessageInterpolator接口的默认实现类ResourceBundleMessageInterpolator进行解析。 - 该实现类基于Java的
ResourceBundle机制,从加载的资源文件中查找对应键的消息文本。 - 找到后就把占位符替换成真实的错误消息;如果找不到对应键,会保留占位符文本,或者使用Validator内置的兜底消息。
- 识别到属性值是带
底层扩展支持:如果需要自定义消息加载逻辑,你也可以实现自己的
MessageInterpolator,替换掉默认实现,比如从数据库或者其他配置中心加载消息。
内容的提问来源于stack exchange,提问作者wiwitadityasaputra
相关产品推荐
相关产品推荐

