在 Freemarker 中使用 Java 属性

发布于 2024-11-07 05:36:17 字数 1044 浏览 3 评论 0原文

您好,

我的应用程序中有一个典型的 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

筑梦 2024-11-14 05:36:17

我相信问题在于,使用 lang.mail.layout.greeting 键,Freemarker 将 . 之间的每个部分视为 hash 即可以具有子变量的容器变量。因此,它尝试从数据模型中获取 lang 引用的对象,然后尝试从 lang 获取 mail 引用的变量。然而,在您的情况下,不存在这样的对象,因此会出现错误。

文档中有关于变量名称的说明

在此表达式中,变量名只能包含字母(包括非拉丁字母)、数字(包括非拉丁数字)、下划线 (_)、美元 ($)、at 符号 (@) 和井号 (#) 。此外,名称不能以数字开头。

您可以使用替代语法从哈希中获取数据(只要因为表达式计算结果为字符串)

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

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 by lang from the data-model and then attempts to get the variable referenced by mail from lang. In your case, however, there is no such object, hence the error.

The documentation has this to say about variable names:

In this expression the variable name can contain only letters (including non-Latin letters), digits (including non-Latin digits), underline (_), dollar ($), at sign (@) and hash (#). Furthermore, the name must not start with digit.

You might make use of the alternative syntax to get data from a hash (as long as the expression evaluates to a string)

<p>${lang["mail.layout.greeting"]} ${user.firstname},</p>
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文