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的第一个实体中取出。

经验分享 程序员 微信小程序 职场和发展