为什么 Spring 使用 Hibernate Validator 的消息插值参数替换不起作用?

Why Spring Message Interpolation Argument Replacement using Hibernate Validator don't work?

我使用 Spring4 + Hibernate5 Validator 进行验证。

我不想使用默认的ValidateMessage.properties,所以我在类路径根目录下的I18N目录下定义了自己的消息属性, 配置信息如下:

<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
    <property name="basenames" value="I18N.messages,I18N.validation.ValidationMessages" />
    <property name="defaultEncoding" value="UTF-8" />
    <!-- Set whether to use the message code as default message instead of throwing a NoSuchMessageException. 
        Useful for development and debugging. 
        Default is "false".-->
    <property name="useCodeAsDefaultMessage" value="true"/>
    <!-- The key here is fallbackToSystemLocale which prevents the system to look into the system, 
        thus using "message.properties" if he doesn't find the locale. -->
    <property name="fallbackToSystemLocale" value="false"/>
</bean>

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

<mvc:annotation-driven validator="validator"/> 

bean 验证信息是:

 @Size(
        min = 2,
        max = 14,
        message = "The license plate must be between {min} and {max} characters long"
)

我在 Spring 应用程序中使用此表示法,但这些参数未被替换。我回来了 "The license plate must be between min and max characters long".

参考Spring Message Interpolation Argument Replacement using Hibernate Validator

不知道为什么不行,谁能帮忙解决一下?谢谢

我找到原因了。这是由 属性 "useCodeAsDefaultMessage" 引起的,我们不能将其设置为 "true",只需使用默认值 "false"。看来如果是真的,直接从"basenames"中的properties文件中获取messages,不要使用classpath根路径中的默认message文件或者"org/hibernate/validator"!