2016-01-08 70 views
0

我目前使用Freemarker生成一些配置文件。到目前爲止,這些都是xml文件或適當格式的文本文件。我現在想要生成一些Java .properties文件,但遇到了一些問題。使用Freemarker生成Java .properties文件

首先是字符編碼。據我所知簡單地添加

<#ftl encoding="8859_1"> 

到文件的開始應該對此進行排序。

第二個問題是密鑰和值的轉義。鍵可能是好的,因爲我會在模板中對它們進行硬編碼,所以我可以在模板中將它們轉義出來。這些值將來自我的數據模型,因此需要轉義。

我可以看到我如何創建我自己的user defined directive,並將其安裝爲shared variable在我的模板中使用它。

這是最好或唯一的方法來做到這一點?我以爲生成.properties文件是之前已經解決了很多次的問題,並且希望在我開始編寫自己的代碼之前可能已經存在一些東西。

+1

關於該字符集名稱,也許Java識別'8859_1'(我不知道),但它應該是'ISO-8859-1'。 – ddekany

回答

2

java.util.Properties類獲取了各種存儲方法以將屬性保存到OutputStreams或文件。這似乎比嘗試適應freemarker更可取。

1

我不明白特定於生成properties文件的charset問題。但請注意,模板的字符集和輸出的字符集是獨立的,因此您不妨使用與其他模板相同的字符集(比如UTF-8)。

由於轉義,如果可以,請始終使用自動轉義。在2.3.24版本中,特別流暢,但除非允許使用未發佈版本,否則必須等到2月底左右。 (如果您可以使用未發佈/非正式版本,you can find瞭解開發人員列表存檔中的內部測試版本。)在2.3.24之前,有<#escape x as propEsc(x)>all the template content here</#escape>,其中propEscTemplateMethodModelEx(而不是TemplateDirectiveModel),您已添加爲共享變量或這樣。所有${...} -s都會神奇地逃脫。

+0

charsets沒有特別的問題 - 它只是Java .properties文件總是使用8859_1。在我的情況下,我有一些文件同時使用通用數據模型進行模板化,除了.properties文件外,所有文件都是UTF-8。我正在做批量操作,迭代所有模板並依次處理 - 我不想有任何特殊情況。似乎在模板中添加編碼指令可解決此問題。 – pauli

+1

如果您還確保結果OutputStreamWriter使用ISO-8859-1,那麼添加'#ftl編碼'僅解決此問題。其中一個想法是使用'template.getEncoding()'的返回值來設置輸出字符集。 (順便說一下,它只是2.3.24,但是你可以配置FreeMarker,這樣所有'* .properties.ftl'模板都使用ISO-8859-1,而其他的則使用UTF-8,這樣你就可以擺脫如果使用'#ftl'頭文件,類似地,你將能夠指定基於模板名稱模式的轉義算法。) – ddekany

+0

我已經設置了輸出編碼以匹配(現在)設置的.properties模板的輸入編碼到ISO_8859_1,並且它似乎一切正常。我期待2.3.24!我懷疑.properties文件總是會很尷尬,因爲它似乎沒有使用「文件範圍」轉義算法 - 它們對於鍵和值具有略微不同的轉義算法。 – pauli