Spring使用错误的编码来定制验证消息

时间:2014-04-07 15:19:19

标签: spring spring-mvc utf-8 internationalization bean-validation

我有一个带有一些验证的Spring表单,而javax.validation.constraints的所有个性化messeges似乎都使用了错误的编码。

让我们以此为例:

@NumberFormat(style=Style.NUMBER) 
@NotNull 
private BigDecimal maintenanceCosts;

使用包含

的applicationContext.xml文件
<bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
    <property name="defaultEncoding" value="UTF-8" />
    <property name="basenames">
        <list>
            <value>classpath:messages</value>
            <value>classpath:ValidationMessages</value>
        </list>
    </property>
</bean>

<bean id="localeResolver" class="org.springframework.web.servlet.i18n.SessionLocaleResolver">
    <property name="defaultLocale" value="en" />
</bean>

ValidationMessage_en.properties以UTF-8编码并标记为(在Eclipse中右键单击属性),文本为:

  

javax.validation.constraints.NotNull.message =此字段不能为空

我想在具有正确编码的本地化字符串中显示thouse消息,因此我添加了一个UTF-8文件ValidationMessages_ru.properties:

  

javax.validation.constraints.NotNull.message = Этополенеможетбыть   пустым

但是消息显示了这条消息: ÐÑ,оÐÐÐÐÐÐÐÐÐÐ~~~~~~~~

另一方面,我能够使用正确的编码自定义spring托管错误消息。但JSR303文本的行为似乎有所不同。

2 个答案:

答案 0 :(得分:5)

我发现摆脱ValidationMessages_XX.properties文件要优雅得多。只是一个支持UTF-8的文件中的所有本地化配置!

答案是使用您的resourceBundle设置验证器的ValidationMessageSource。例如:

<bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource" 
        p:defaultEncoding="UTF-8"
        p:basenames      ="classpath:messages"/>

<!-- JSR-303 validation-->
<bean id ="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"
        p:validationMessageSource-ref="messageSource"/>

所有优点必须归功于此blog帖子。无法阅读thouse字符是令人讨厌的。不再:message = \ u042D \ u0442 \ u043E \ u043F \ u043E \ u043B \ u0435 \ u043D \ u0435 \ u043C

答案 1 :(得分:0)

Java中的属性文件是默认的ISO 8859-1。您无法以这种方式显示的字符需要使用unicode转义。引用Properties的javadoc:

  

...除了输入/输出流以ISO 8859-1字符编码   编码。无法直接表示的字符   编码可以使用Unicode转义编写;只有一个'你'   转义序列中允许使用字符。

您需要使用unicode转义符。您可以手动操作或使用 native2ascii