2011-05-16 19 views
6

HI,在Freemarker中使用Java屬性

我在我的應用程序中有一個典型的messages.properties文件。 我正嘗試使用Freemarker生成電子郵件。

Freemarker模板應生成String,之後我會通過電子郵件將String發送給用戶。但是,我們需要它多種語言。 因此想到了Properties

我的屬性文件看起來是這樣的:

mail.layout.contactus=Contacteer ons 
mail.layout.greeting=Hoi 

在Java中,我在HashMap進入Properties文件是這樣的:

rootMap.put("lang", (mail.getLanguage().equals(Language.FRENCH) ? langFR : langNL)); 

並嘗試像這樣來讀取它的FreeMarker:

<p>${lang.mail.layout.greeting} ${user.firstname},</p> 

但是得到以下異常:

freemarker.core.InvalidReferenceException: Expression lang.mail is undefined on line 10, column 116 in layout/email.ftl. 

奇怪的是,它只是說lang.mail而不是lang.mail.layout.greeting

編輯: 我試圖定義這樣我的鑰匙:

mail_layout_contactus=Contacteer ons 
mail_layout_greeting=Hoi 

它確實工作

回答

4

我相信問題在於用關鍵碼lang.mail.layout.greeting,Freemarker trea在.之間的每個部分作爲hash,即容器變量,其可以具有子變量。因此它試圖從數據模型中獲取由lang引用的對象,然後嘗試從lang獲取由mail引用的變量。但是,在你的情況下,不存在這樣的對象,因此是錯誤的。

The documentation has this to say about variable names

在這個表達式的變量名只能包含字母(包括非拉丁字母),數字(包括非拉丁位),下劃線(_),美元($),在符號(@)和散列(#)。此外,名稱不得以數字開頭。

你可能會利用alternative syntax to get data from a hash的(只要表達式的計算結果爲字符串)

<p>${lang["mail.layout.greeting"]} ${user.firstname},</p> 
+0

大,的作品!謝謝 – 2011-05-17 06:36:25