Hibernate Validator 第13篇:自定义内插约束错误信息
如果默认的消息内插算法不能满足你的需要,也可以自定义一个MessageInterpolator实现。
自定义插值消息必须实现javax.validation.MessageInterpolator接口。这个实现是线程安全的。这个实现会被委托给默认的差值器,也就是Configuration#getDefaultMessageInterploator()方法获得的。
为了使用一个自定义消息插值器,它必须被注册,或者是在xml中配置,一般在META-INF/ validation.xml()或者把它传递给ValidatorFactory或者Validator。
一、ResourceBundleLocator
在有些情况下,你想用Bean Validation规范中的自定义消息差值算法,但是从其他的资源目录中得到错误消息,而不是ValidationMessages中。这种情况下,Hibernate Validator的ResourceBundleLocator SPI可以使用。
ResourceBundleMessageInterpolator将资源包的检索委托给该SPI。只需要像下面的例子中,传递一个实例,这个实例带有名字,当激活ValidatorFactory时,就可以使用一个可用的包。
Validator validator = Validation.byDefaultProvider()
.configure()
.messageInterpolator(
new ResourceBundleMessageInterpolator(
new PlatformResourceBundleLocator( "MyMessages" )
)
)
.buildValidatorFactory()
.getValidator();
当然你也可以实现一个完全不同的ResourceBundleLocator,它返回在数据库中有记录的包。这时,你可以通过HibernateValidatorConfiguration#getDefaultResourceBundleLocator()方法获得一个默认的加载器。你可以使用它作为你自己的的加载器的一个备用。
除了PlatformResourceBundleLocator,Hibernate Validator提供了另外的一个开箱即用的资源包加载器,名叫AggregateResouceBundleLocator。它允许从不止一个资源包中检索错误信息。
比如,你可以在多个模块应用中,使用这个实现,在那里每个模块中你都可以获得消息。下面是例子:
Validator validator = Validation.byDefaultProvider()
.configure()
.messageInterpolator(
new ResourceBundleMessageInterpolator(
new AggregateResourceBundleLocator(
Arrays.asList(
"MyMessages",
"MyOtherMessages"
)
)
)
)
.buildValidatorFactory()
.getValidator();
多个资源包按顺序被传递给这个构造器,这意味着如果几个资源包,包含一个被指定key的实体,这个value会从包含这个key的第一个实体中取出。
