Freemarker:如何检查?api-able类型(v 2.3.26)

时间:2017-10-09 17:15:08

标签: hashmap freemarker

在Freemarker中,模型中有Map<Map<...>>

由于FM故障,查询第二级Map需要?api。但是,这会逃避正常值存在检查并使事情变得复杂。

这就是我所拥有的:

<#if sortedStatsMap[rowTag.name]?? && sortedStatsMap[rowTag.name]?is_hash>
    ${mapToJson(sortedStatsMap[rowTag.name]?api.get(boxTag.name))!}
</#if>

这最终得到:

APINotSupportedTemplateException: The value doesn't support ?api. See requirements in the FreeMarker Manual.
(FTL type: sequence+extended_hash+string (wrapper: f.c.DefaultToExpression$EmptyStringAndSequence),
TemplateModel class: f.c.DefaultToExpression$EmptyStringAndSequence, 
ObjectWapper: freemarker.template.DefaultObjectWrapper@1074040321(2.3.26, useAdaptersForContainers=true, forceLegacyNonListCollections=true, iterableSupport=trueexposureLevel=1, exposeFields=false, treatDefaultMethodsAsBeanMembers=true, sharedClassIntrospCache=@1896185155, ...))
The blamed expression:
==> sortedStatsMap[rowTag.name]!  [in template "reports/templates/techReport-boxes.ftl" at line 152, column 84]

如果我尝试

sortedStatsMap[rowTag.name]!?is_hash

然后这也失败了,因为如果遗漏,它会让我empty_string_and_sequence并且?is_hash无法应用,据报道。 (说错误。)

检查我是否可以使用?api.get(key)的正确逻辑是什么?或者使用!处理缺失值或丢失密钥的正确方法?

1 个答案:

答案 0 :(得分:0)

您可以使用?api检查值是否支持?has_api。虽然也许你不需要那个;应该澄清这个例子和与之相关的问题(见我的评论)。