2015-03-30 2 views
1

Я пытаюсь проверить, содержит ли карта значение, чтобы условно выполнить некоторый код 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?


Update Здесь:

кажется хэш не нравится Длинное значение ключа, если я могу изменить его на это, КРП проверки работы, но стоимость не получает извлекаться, даже если она существует - так что, я думаю, теперь вопрос заключается в том, как получить значение из хеша с ключом 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> 
+0

Итак, я получил эту работу, но взял «более простой» подход к преобразованию моего (к счастью) переходного хеша для использования строковых ключей (см. Здесь: http://freemarker.org/docs/app_faq.html#faq_nonstring_keys) - теперь мой код - это полный беспорядок преобразований типов, но он работает по крайней мере ... (я полностью сожалею о переходе от JSTL к Freemarker) –

+0

Почему бы вам просто не использовать '? api', о котором также говорится в FAQ? связаны? – ddekany

+0

Казалось, что немного длиннее, чтобы получить конфигурацию - это не так уж важно для этого экземпляра, чтобы сделать ключ строкой. –

ответ

1

[] поддерживает только строку хеш (Map и т.д.) ключи и числовую последовательность (List, массив и т.д.) индексы. На данный момент решение не использует [] для Map -s с нестрочными ключами. Вместо этого вы можете использовать Java API объекта, например myMap?api.get(nonStringKey) и т. Д. Обратите внимание, что в конфигурации должно быть разрешено использовать ?api; см. http://freemarker.org/docs/ref_builtins_expert.html#ref_buitin_api_and_has_api для получения дополнительной информации.

Смежные вопросы