在 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
这确实有效
HI,
I have a typical messages.properties
file in my application.
I'm trying to generate an email using Freemarker.
The Freemarker template should generate to a String
, after which I'll send the String
to the user via email. However, we need it multilingual.
So Properties
came to mind.
My properties file looks like this:
mail.layout.contactus=Contacteer ons
mail.layout.greeting=Hoi
In Java, I enter the Properties
file in my HashMap
like this:
rootMap.put("lang", (mail.getLanguage().equals(Language.FRENCH) ? langFR : langNL));
And try to read it in FreeMarker like this:
<p>${lang.mail.layout.greeting} ${user.firstname},</p>
But get following exception:
freemarker.core.InvalidReferenceException: Expression lang.mail is undefined on line 10, column 116 in layout/email.ftl.
Strangely, it only says lang.mail
as opposed to lang.mail.layout.greeting
Edit:
I tried defining my keys like this:
mail_layout_contactus=Contacteer ons
mail_layout_greeting=Hoi
which does work
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
我相信问题在于,使用
lang.mail.layout.greeting
键,Freemarker 将.
之间的每个部分视为 hash 即可以具有子变量的容器变量。因此,它尝试从数据模型中获取lang
引用的对象,然后尝试从lang
获取mail
引用的变量。然而,在您的情况下,不存在这样的对象,因此会出现错误。文档中有关于变量名称的说明:
您可以使用替代语法从哈希中获取数据(只要因为表达式计算结果为字符串)
I believe the problem is that with a key of
lang.mail.layout.greeting
, Freemarker treats each part between the.
s as a hash i.e. a container variable that can have subvariables. So it attempts to get the object referenced bylang
from the data-model and then attempts to get the variable referenced bymail
fromlang
. In your case, however, there is no such object, hence the error.The documentation has this to say about variable names:
You might make use of the alternative syntax to get data from a hash (as long as the expression evaluates to a string)