Начиная с 2.3.25, делайте это так:
<#list user as propName, propValue>
${propName} = ${propValue}
</#list>
Обратите внимание, что это также работает с нестроковыми ключами (в отличие от того map[key], что нужно было записать как map?api.get(key)тогда).
До 2.3.25 стандартным решением было:
<#list user?keys as prop>
${prop} = ${user[prop]}
</#list>
Однако некоторые действительно старые интеграции FreeMarker используют странную конфигурацию, в которой общедоступные Mapметоды (например, getClass) отображаются как ключи. Это происходит, когда они используют чистый BeansWrapper(вместо DefaultObjectWrapper), simpleMapWrapperсвойство которого было оставлено false. Вам следует избегать такой настройки, поскольку она смешивает методы с реальными Mapзаписями. Но если вы столкнетесь с такой неудачной настройкой, способ избежать ситуации - использовать открытые методы Java, такие как user.entrySet(), user.get(key)и т.д., а не использовать конструкции языка шаблонов, такие как ?keysили user[key].