2

迭代地图时

<#list map?keys as key> ${key} </#list>

将返回 clone、1、getKey、5 等

任何人都有解决方案,而不是一一删除不需要的值?

4

2 回答 2

4

如果我理解得很好,您可以混合使用方法和键。这取决于object_wrapper配置设置 ( Configuration.setObjectWrapper(ObjectWrapper))。如果您使用 aBeansWrapper作为object_wrapper(而不是DefaultObjectWrapper,从来没有这个问题),这可以通过yourBeansWrapper.setSimpleMapWrapper(true). 然而,在那个项目中它可能不是偶然的false。FreeMarker 语言没有地图类型存在问题。它有一个叫做哈希的东西,只支持字符串键(子变量)。所以人们可能只使用 -s 的 Java API而不是像,等java.util.Map这样的哈希运算符,这是需要的,否则你看不到这些方法。那你应该写。[]?keyssetSimpleMapWrapper(false)Mapmap.keySet()

更新:在 2.3.22 及更高版本中,没有人被迫再使用混合方法和键(即使在当时,这也是一个相当令人困惑的解决方法),因为 Java 方法(和 Java Bean 属性)可以在单独的命名空间中通过 访问?api,例如myMap?api.get(nonStringKey)myMap?api.keySet()。因此,您可以使用仅ObjectWrapper公开Map密钥并支持该?api功能(最好是object_wrapper=DefaultObjectWrapper(2.3.22))、启用?apiapi_builtin_enabled=true;默认情况下不允许向后安全性),然后仅?api在需要 Java API 命名空间中的某些内容时使用,否则使用[], ?keys, 等等,如果你的Map键是String-s。

于 2012-10-20T08:00:19.103 回答
1

尝试使用以下语法

<#assign keys = map?keys>
<#list keys as key>${key} = ${h[key]}; </#list>

见链接

编辑 - 扩展@ddekany 答案,

您需要在解析/调用 FTL 的代码中处理此问题,如下所示(只是示例代码)。如果您可以在此处添加 FTL 处理代码,可能会更好。

 BeansWrapper ow = new BeansWrapper();
  ow.setExposeFields(true);
 // ow.setSimpleMapWrapper(true);

  Template template = freeMarkerConfiguration.getTemplate(templateName, locale);
  template.setObjectWrapper(ow);
  template.process(root, writer);
于 2012-10-20T08:06:57.043 回答