2015-01-10 159 views
3

我試圖找到一種方法來設置UTF-8編碼的屬性,通過@Value註釋從Spring.apprent.property文件訪問Spring引導。到目前爲止,我已經通過創建一個bean被成功設置編碼到我自己的屬性來源:Spring Boot默認屬性編碼更改?

@Bean 
@Primary 
public PropertySourcesPlaceholderConfigurer placeholderConfigurer(){ 
    PropertySourcesPlaceholderConfigurer configurer = new PropertySourcesPlaceholderConfigurer(); 
    configurer.setLocation(new ClassPathResource("app.properties"); 
    configurer.setFileEncoding("UTF-8"); 
    return configurer; 
} 

這樣的解決方案提出了兩個問題。有一次,它不適用於Spring Boot默認使用的「application.properties」位置(http://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html#boot-features-external-config),並且我被迫使用不同的文件名。

而另一個問題是,我只剩下手動定義和排序多個來源的支持位置(例如在jar vs jar外部屬性文件等),因此重做已經完成的工作。

如何獲得對已配置的PropertySourcesPlaceholderConfigurer的引用,並在應用程序初始化的恰當時間更改其文件編碼?

編輯: 也許我在其他地方犯了一個錯誤?這是什麼原因造成的實際問題對我來說:當我使用application.properties允許用戶個人的名字適用於從應用程序發送的電子郵件:

@Value("${mail.mailerAddress}") 
private String mailerAddress; 

@Value("${mail.mailerName}") 
private String mailerName;      // Actual property is Święty Mikołaj 

private InternetAddress getSender(){ 
    InternetAddress sender = new InternetAddress(); 
    sender.setAddress(mailerAddress); 
    try { 
     sender.setPersonal(mailerName, "UTF-8"); // Result is Święty Mikołaj 
     // OR: sender.setPersonal(mailerName); // Result is ??wiÄ?ty Miko??aj 
    } catch (UnsupportedEncodingException e) { 
     logger.error("Unsupported encoding used in sender name", e); 
    } 
    return sender; 
} 

當我有placeholderConfigurer豆如上圖所示加入,並把我的財產在'app.properties'內部,它被重新設置好了。只需將該文件重命名爲'application.properties'即可將其分解。

+1

在這之前,你肯定沒有簡單的解決方案?我使用環境變量,並且使用了UTF-8的application.properties,沒有任何特別的問題。你遇到的問題究竟是什麼? –

+0

@AlessandroSantini我已經更新了它對我造成的特殊問題。 – JockX

+0

如果您調試該類,您是否看到錯誤?這聽起來更像是一個輸出問題。 – chrylis

回答

6

Apparently Spring Boot的ConfigFileApplicationListener加載的屬性以ISO 8859-1字符編碼進行編碼,這是通過設計並根據格式規範編碼的。

另一方面,.yaml format支持UTF-8開箱即用。一個簡單的擴展更改爲我解決了這個問題。

0

@JockX建議完美。另外,從屬性到yaml的轉換非常簡單。 此:

spring.main.web_environment=false 
email.subject.text=Here goes your subject 
email.from.name=From Me 
[email protected] 
email.replyTo.name=To Him 
[email protected] 

將成爲:

spring: 
    main: 
    web_environment: false 
email: 
    subject: 
    text: Here goes your subject 
    from: 
    name: From Me 
    address: [email protected] 
    replyTo: 
    name: To Him 
    address: [email protected]