【问题标题】:Spring uses wrong codification for customized validation messagesSpring 对自定义验证消息使用错误的编码
【发布时间】:2014-05-19 22:33:58
【问题描述】:

我有一个带有一些验证的 Spring 表单,并且来自 javax.validation.constraints 的所有个性化消息似乎都使用了错误的编码。

我们以这个为例:

@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 文本的行为似乎有所不同。

【问题讨论】:

  • 您确定属性文件是 UTF-8 且 Eclipse 不会自动对非 ASCII 字符进行编码吗?您是否在普通文本编辑器中检查了该文件?
  • 我用notepad++做的
  • 好吧,请尝试this配置。它可能与您的问题无关,但只是为了确保它不是配置问题。您使用的是什么版本的 Spring 和 Hibernate Validator?
  • Spring 版本是 3.2.3.RELEASE Hibernate 验证器是 4.2.0.Final
  • Oki,你试过链接配置吗?如果还是不行,尝试将 Hibernate Validator 升级到 4.3.1.Final。

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


【解决方案1】:

我发现摆脱 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 字符很烦人。不再:消息=\u042D\u0442\u043E \u043F\u043E\u043B\u0435 \u043D\u0435 \u043C

【讨论】:

    【解决方案2】:

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

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

    您将需要使用 unicode 转义。你可以手动di它或使用native2ascii

    【讨论】:

    • 这是真的,除了他没有使用旧版 Java ResourceBundle,而是 Spring 的 MessageSource 没有这个愚蠢的限制。
    • 从 Java 5 开始,似乎有一些函数可以读取 UTF-8 中的属性。 bordet.blogspot.com.es/2007/01/… 无论如何,这个愚蠢的限制真的很烦人。附:我觉得-1有点难。我非常感谢他的洞察力,即使它并不能真正解决问题,但它有助于解释为什么会发生。
    猜你喜欢
    • 1970-01-01
    • 2021-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-22
    • 2016-04-18
    • 2016-12-04
    相关资源
    最近更新 更多