在 Freemarker 中通过 Enum 键访问 Map 元素

Posted

技术标签:

【中文标题】在 Freemarker 中通过 Enum 键访问 Map 元素【英文标题】:Accessing Map elements via Enum key in Freemarker 【发布时间】:2011-03-27 06:54:57 【问题描述】:

我正在尝试访问 HashMap 中的元素。 此 HashMap 的键由 Enum 定义。

查看文档后,我认为为了能够访问 Enum,我必须像这样将其发送到 Freemarker:

BeansWrapper wrapper = BeansWrapper.getDefaultInstance();
TemplateHashModel enumModels = wrapper.getEnumModels();
TemplateHashModel fieldTypeModel = (TemplateHashModel)enumModels.get("com.example.MinisiteFieldType");
root.put("fieldtypes", fieldTypeModel);

在我的 .ftl 中,我尝试了以下操作:

$myelement.mymap[fieldtypes.SEOTEXT]

但是我得到: 表达式 myelement.mymap[fieldtypes.SEOTEXT] 在 X 行未定义...

我想确保我正确映射了枚举,所以我尝试了:

$fieldtypes.SEOTEXT

这没有打印任何东西,让我想知道它是否通过了,或者根本无法打印。

在 Java 调试中,在我的根 Map 中插入 TemplateHashModel 之前,'fieldTypeModel' 填充了正确的数据...

任何帮助将不胜感激!

巴特

【问题讨论】:

【参考方案1】:

我怀疑您的问题是,通过使用 [] 语法访问您的地图,您隐含地告诉 Freemarker 将其视为哈希。这可能不会像您期望的那样工作——散列可能代表 Map 对象,将“大小”和“包含键”等映射到 Java 方法。相反,请尝试:

$myelement.mymap.get(fieldtypes.SEOTEXT)

附带说明一下,我从未尝试过通过您描述的方法访问枚举,但是还有另一种方法可以从不需要 Java 代码的模板中访问 Java 常量,因此以下方法也应该有效:

$myelement.mymap.get(stack.findValue("@com.example.MinisiteFieldType@SEOTEXT"))

【讨论】:

我尝试了 .get() 示例,但我得到“mymap.get is undefined on line...” :(

以上是关于在 Freemarker 中通过 Enum 键访问 Map 元素的主要内容,如果未能解决你的问题,请参考以下文章

在多处理中通过键访问字典中的值

如何在 Linux tclsh 中通过光标键获取命令历史记录

100个 Unity小知识点 | C#中通过 数字int值 获取 枚举Enum 中的数值

100个 Unity小知识点 | C#中通过 数字int值 获取 枚举Enum 中的数值

enum在java中是啥意思

如何在php中通过空键取消设置数组