迭代地图时
<#list map?keys as key>
${key}
</#list>
将返回 clone、1、getKey、5 等
任何人都有解决方案,而不是一一删除不需要的值?
迭代地图时
<#list map?keys as key>
${key}
</#list>
将返回 clone、1、getKey、5 等
任何人都有解决方案,而不是一一删除不需要的值?
如果我理解得很好,您可以混合使用方法和键。这取决于object_wrapper
配置设置 ( Configuration.setObjectWrapper(ObjectWrapper)
)。如果您使用 aBeansWrapper
作为object_wrapper
(而不是DefaultObjectWrapper
,从来没有这个问题),这可以通过yourBeansWrapper.setSimpleMapWrapper(true)
. 然而,在那个项目中它可能不是偶然的false
。FreeMarker 语言没有地图类型存在问题。它有一个叫做哈希的东西,只支持字符串键(子变量)。所以人们可能只使用 -s 的 Java API而不是像,等java.util.Map
这样的哈希运算符,这是需要的,否则你看不到这些方法。那你应该写。[]
?keys
setSimpleMapWrapper(false)
Map
map.keySet()
更新:在 2.3.22 及更高版本中,没有人被迫再使用混合方法和键(即使在当时,这也是一个相当令人困惑的解决方法),因为 Java 方法(和 Java Bean 属性)可以在单独的命名空间中通过 访问?api
,例如myMap?api.get(nonStringKey)
等myMap?api.keySet()
。因此,您可以使用仅ObjectWrapper
公开Map
密钥并支持该?api
功能(最好是object_wrapper=DefaultObjectWrapper(2.3.22)
)、启用?api
(api_builtin_enabled=true
;默认情况下不允许向后安全性),然后仅?api
在需要 Java API 命名空间中的某些内容时使用,否则使用[]
, ?keys
, 等等,如果你的Map
键是String
-s。
尝试使用以下语法
<#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);