检查地图是否包含Freemarker模板中的值

时间:2015-03-30 06:30:46

标签: freemarker

我试图检查地图是否包含有条件地执行某些freemarker代码的值。这是我到目前为止所得到的:

<#if productLayout.layoutWidgetConfiguration[pos.id]??>
    <#assign configId>${productLayout.layoutWidgetConfiguration[pos.id]}</#assign>
<#else>
    <#assign configId></#assign>
</#if>

但是我得到了这个错误,基本上没有if条件。

Error executing FreeMarker template freemarker.core.UnexpectedTypeException: For "...[...]" left-hand operand: Expected a sequence or string (or something that's implicitly convertible to string), but this evaluated to an extended_hash (wrapper: f.t.SimpleHash):
==> productLayout.layoutWidgetConfiguration  [in template "admin/pages/catalog/products/partials/productLayoutEditorRefreshZone.ftl" at line 7, column 22]

The failing instruction (print stack trace for 9 more):
==> #if productLayout.layoutWidgetConfigu...  [in template "admin/pages/catalog/products/partials/productLayoutEditorRefreshZone.ftl" at line 7, column 17]
    at freemarker.core.DynamicKeyName.dealWithNumericalKey(DynamicKeyName.java:141) ~[DynamicKeyName.class:2.3.20]

如何检查freemarker模板中的地图中是否存在值?


在此更新:

如果将哈希值更改为此值,哈希似乎不喜欢Long键值,if检查有效,但即使存在,该值也不会被检索 - 所以我想现在的问题是如何使用java.lang.Long键从哈希中检索值?

<#assign configId = "">
<#if productLayout.layoutWidgetConfiguration[pos.id?string]?has_content>
    Hello
    <#assign configId = productLayout.layoutWidgetConfiguration[pos.id?string]>
</#if>
<h1>${pos.id}</h1>  

1 个答案:

答案 0 :(得分:1)

[]仅支持字符串哈希(Map等)键和数字序列(List,数组等)索引。目前,该解决方案没有使用[]用于Map - s和非String键。您可以改为使用对象的Java API,例如myMap?api.get(nonStringKey)等。请注意,配置中必须允许?api;有关详情,请参阅http://freemarker.org/docs/ref_builtins_expert.html#ref_buitin_api_and_has_api