2017-01-23 2 views
0

я передаю следующее с помощью контроллера:Итерация HashMap, который имеет нестроковую пару ключей и ArrayList в качестве значения

HashMap<SomeClassA, ArrayList<SomeClassB>> 

SomeClassA и SomeClassB не примитивы, и кодируется мной. Их геттеры - это либо Струны, либо Лонги. Позволяет вызвать переменную HashMap a map123.

То, что я пытаюсь сделать, это что-то вроде этого кода:

<#list map123?keys as key> 
    ${key} = ${map123[key]} 
</#list> 

Однако то, что я получаю, что map123 [ключ] является NULL! Это означает, что я не могу перебирать ArrayList.

Что я сделал неправильно (или что я должен делать вообще)?

ответ

1

Это легко самое проблемное наследие в FreeMarker 2, но у него есть обходные пути. Оператор [] не поддерживает нестрочные ключи. Это было бы ошибкой, но из-за неудачного сотрудничества с еще одним наследием обычно происходит то, что поиск молча выполняется с помощью toString() объекта, и поэтому вы просто не найдете этот элемент.

Решение: Если вам просто нужно перебирать, просто использовать, по крайней мере, версия 2.3.25-incubating (это стабильный окончательный релиз) и написать:

<#list map123 as key, value> 
    ${key} = ${value} 
</#list> 

Если вы должны получить значение по ключу в противном случае, вы можете упасть вернуться к API Java Map: map123?api.get(key). (Обратите внимание, что ?api должен быть явно включен в конфигурации FreeMarker, но сообщение об ошибке будет сказать, что.)

+0

в версии FreeMarker Я нас ing интегрирован в FrameWork, поэтому, если обновление инфраструктуры не изменится, я не могу изменить версии. Итак, обходной путь, который я должен использовать, заключается в импровизации, присоединяя только значения, которые мне нужны от SomeClassA и SomeClassB, в один SomeClassC и передают его как список. –

+0

Если вы не можете переопределить эту версию с более высокой (потому что фреймворк - это не просто зависимость от Maven), то, возможно, самым чистым решением является выдержка (или вытягивание через '? New') некоторой утилиты' TemplateMethodModelEx', которая получает Java-карту из своего аргумента через 'WrapperTemplateModel.getWrappedObject()', а затем создает желаемый список результатов. Итак, вы можете использовать что-то вроде '<#list mapEntries (map123) как kvp> $ {kvp.key} = $ {kvp.value}'. – ddekany

+0

Также обратите внимание, что '? Api' был введен в FreeMarker 2.3.22, который не совсем новый. Если у вас есть '? Api' по крайней мере, вы можете сделать' <#list map123? Api.entrySet() как kvp> $ {kvp.key} = $ {kvp.value} '. – ddekany

1

Если вы не можете использовать пар ключ-значение (с 2.3.25)

<#list map123 as key, value> 
    ${key} = ${value} 
</#list> 

вы можете попробуйте

<#list map123.entrySet() as entry > 
    ${entry.key} = ${entry.value} 
</#list> 

вы можете легко проверить null значения с ?exists директивы или просто ${entry.value!"default"}

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