3

我有一些Spring驗證表單,並且所有來自javax.validation.constraints的個性化messeges似乎都使用了錯誤的編碼。Spring使用錯誤的編碼來定製驗證消息

讓我們此作爲一個例子:

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

用含有

<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> 

applicationContext.xml文件而一個ValidationMessage_en.properties以UTF-8編碼和標記,以便(在Eclipse與右擊,屬性)與文字:

javax.validation.constraints.NotNull.message =該字段不能爲空

我想用正確的編纂本地化的字符串顯示thouse的消息,所以我說的UTF-8文件ValidationMessages_ru.properties有:

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

但該消息顯示此消息: ÐÑ,опоРÐμнÐμможÐμÑ,d±Ñ<Ñ,ьпуÑÑ,Ñ<м

在另一方面I具有能夠與正確的編碼來定製彈簧管理錯誤消息。但JSR303文本似乎有不同的表現。

+0

您是否確定該屬性文件是UTF-8,並且Eclipse並非自動編碼非ASCII字符?您是否在普通文本編輯器中檢查了該文件? –

+0

我用記事本++來做 – borjab

+0

好吧,請嘗試[this](http://stackoverflow.com/a/20912549/2217862)配置。它可能與您的問題沒有關係,但只是爲了確保它不是配置問題。你使用的是什麼版本的Spring和Hibernate Validator? –

回答

4

我發現擺脫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

0

Java中的屬性文件是默認的ISO 8859-1。無法以這種方式顯示的字符需要使用Unicode轉義符。引用的Properties的Javadoc:

...除了輸入/輸出流中的ISO 8859-1字符 編碼進行編碼。無法直接在此 編碼中表示的字符可以使用Unicode轉義寫入;轉義序列中只允許使用一個'u' 字符。

您將需要使用unicode轉義。您可以手動或使用native2ascii

+0

這是真的,除了他沒有使用遺留Java [ResourceBundle](http://docs.oracle.com/javase/7/docs/api/java/util/ResourceBundle.html),而是Spring的[MessageSource](http ://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/context/MessageSource.html)沒有這個愚蠢的限制。 –

+0

由於Java 5似乎有一些函數可以讀取UTF-8中的屬性。 http://bordet.blogspot.com.es/2007/01/utf-8-handling-for-resourcebundle-and.html 無論如何,這個愚蠢的限制真的很煩人。 P.S.我覺得-1有點難。即使它沒有真正解決它有助於解釋它發生的原因的問題,我也非常感謝他的洞察力。 – borjab