Отсутствуют значения карты (ключ, значение) во Freemarker при случайном доступе? - PullRequest
0 голосов
/ 02 июня 2011

У меня странная проблема с картой Freemarker.Мой пример предназначен для отображения списка автомобилей с именами соответствующих владельцев:

Car(id,name,ownerId)

User(id,name)

Обратите внимание, что ownerId является единственныммост, к которому я могу получить доступ owner из car.По некоторым причинам мы не создаем отношения гибернации для этих доменов.

Я добавил в модель список carList из Car(id,name,ownerId) и Map<String, String> map, который содержит (userId, name) из все пользователей .. Это потому, что Freemarker принимает карту только с ключом типа String.

Зацикливаясь в carList, я пытаюсь получить имя владельца через карту.

<#list carList as car>
  ${map?values[car.ownerId]} - ${car.ownerId}<br/>
</#list>

Ностранно то, что полученный результат:

Tom - 1
Jerry - 2
Jerry - 2
David - 4
- 5
- 5

Имя пользователя "5" отсутствует, но оно существует в базе данных.Кроме того, когда я перебираю карту, результат будет правильным:

<#list map?keys as key>
  ${key} - ${map[key]}
</#list>

Результаты:

1 - Tom
2 - Jerry
3 - Mickey
4 - David
5 - Mike

Отсутствующее имя встречается только для конкретного пользователя.Кто-нибудь знает, чего здесь не хватает?

Ответы [ 2 ]

3 голосов
/ 02 июня 2011

Предупреждение: содержит некоторые предположения!

Я считаю, что частью вашей проблемы является то, что вы используете map?values[car.ownerId] для получения имен пользователя. map?values дает вам последовательность значений вашего map хэша (см. документация FreeMarker ), которая является последовательностью имен пользователей. Затем вы получаете доступ к его элементам по индексу (не по userId!), Который возвращает имена пользователей для большинства случаев, но не тогда, когда userId достигает размера вашей карты, потому что в вашем хэше map с 5 элементами значение последовательность может быть проиндексирована только от 0 до 4, а ваш userId имеет значения от 1 до 5.

Если моя теория верна, то, возможно, использование map[car.ownerId?c] решит вашу проблему (примечание: я предположил, что car.ownerId - это нечто числовое, а поскольку ключи в вашем хэше map - это строки, я использовал ?c встроенный для преобразования чисел в неформатированные строки).

0 голосов
/ 02 июня 2011

Ответ, данный Чакотей, является правильным, хотя я хочу добавить еще один способ обойти эту проблему.Поскольку функция приложения естественным образом используется при использовании карты в качестве простого списка, мы можем зациклить ее, сравнить результат и распечатать, если произойдет равенство.Это немного грязно, но работает.

<#list carList  as car>
  ${car.ownerId} - 
  <#list map?keys as user_id>
    <#if car.ownerId == user_id>${map[user_id]}</#if>
  </#list>
  <br />
</#list>
...