我有一个带有一些验证的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文本的行为似乎有所不同。
答案 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 。