MessageInterpolator春(MessageInterpolator in Spring

2019-06-25 19:17发布

我使用Spring 3.1.1和Hibernate验证器4.3.0.Final并有更改默认MessageInterpolator,从ValidationMessages需要验证消息(类路径)的问题。

我想用ResourceBundleMessageInterpolator将采取从我的春天为messageSource消息

我做了这样的事情在我的应用程序的context.xml:

<bean id="resourceBundleMessageInterpolator"
      class="org.hibernate.validator.messageinterpolation.ResourceBundleMessageInterpolator">
    <constructor-arg index="0">
        <bean class="org.springframework.validation.beanvalidation.MessageSourceResourceBundleLocator">
            <constructor-arg index="0" ref="messageSource"/>
        </bean>
    </constructor-arg>
</bean>
<bean id="validator"
      class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
    <property name="messageInterpolator" ref="resourceBundleMessageInterpolator"/>
</bean>

当我在日志中开始我的web应用程序我看到:

11:04:07,402 DEBUG [org.hibernate.validator.internal.engine.ConfigurationImpl] - 
Setting custom MessageInterpolator of type
 org.springframework.validation.beanvalidation.LocaleContextMessageInterpolator 
11:04:07,402 DEBUG [org.hibernate.validator.internal.engine.ConfigurationImpl] - 
Setting custom ConstraintValidatorFactory of type org.springframework .validation.beanvalidation.SpringConstraintValidatorFactory

因此,大家可以看到,它不是ResourceBundleMessageInterpolator这是我想要的。 这是LocaleContextMessageInterpolator

后来,当我尝试验证的东西我只是得到ValidationMessages.properties消息,而不是从春消息源:

11:08:09,397 DEBUG [org.hibernate.validator.resourceloading.PlatformResourceBundleLocator] - 
ValidationMessages not found.
11:08:09,413 DEBUG [org.hibernate.validator.resourceloading.PlatformResourceBundleLocator] - 
org.hibernate.validator.ValidationMessages found.

你可以从应用程序的context.xml我想用MessageSourceResourceBundleLocator看到,但它的使用,我不知道为什么PlatformResourceBundleLocator

有任何想法吗?

Answer 1:

你不必申报ResourceBundleMessageInterpolatorMessageSourceResourceBundleLocator自己豆(除非你有),它们是由创建LocalValidatorFactoryBean当您提供messageSource

<bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
    <property name="validationMessageSource" ref="messageSource"/>
 </bean>

(它这样做是在引擎盖下:)

public void setValidationMessageSource(MessageSource messageSource) {
    this.messageInterpolator = HibernateValidatorDelegate.buildMessageInterpolator(messageSource);
}

// (...)


private static class HibernateValidatorDelegate {

    public static MessageInterpolator buildMessageInterpolator(MessageSource messageSource) {
        return new ResourceBundleMessageInterpolator(new MessageSourceResourceBundleLocator(messageSource));
    }
}

因此,与简化bean定义,你得到同样的调试输出? 你在哪里使用“验证”裁判? 你可能必须使用<mvc:annotation-driven validator="validator">例如。



文章来源: MessageInterpolator in Spring