如何在Freemarker中访问键为整数的HashMap值

时间:2018-08-02 12:07:21

标签: java freemarker

我有一个名为HashMap<Integer, String>的{​​{1}},由我想在Freemarker模板中呈现的对象提供。

这是Java类:

lookup

我试图像这样访问地图的值:

public class SearchResultContainer implements Container<T> {
    private final Map<Integer, String> lookup;
    private final List<T> items;

    public SearchResultContainer(List<T> items, Map<Integer, String> lookup) {
        this.lookup= lookup;
        this.items = items;
    }

    @Override
    public List<T> getItems() {
        return items;
    }

    public Map<Integer, String> getLookup() {
        return this.lookup;
    }
}

我收到此错误:

  

对于“ ... [...]”左手操作数:预期为序列或字符串或可自动转换为字符串(数字,日期或布尔值)的内容,但已评估为extended_hash(将HashMap包装为ft DefaultMapAdapter):
  ==>查找[在模板[...]
  [...]
  提示:[]中有一个数字值。当前仅支持序列(列表)和字符串。要获取具有非字符串键的Map项,请使用myMap?api.get(myKey)。
  [...]

然后我尝试按照建议使用<#-- @ftlvariable name="self" type="SearchResultContainer" --> <#assign lookup=self.lookup/> <#if lookup?has_content> <#list lookup?keys as key> ${key} = ${lookup[key])} </#list> <#/if>

?api

我收到此错误:

  

不能使用?api,因为“ api_builtin_enabled”配置设置为false。不过,在将其设置为true之前,请三思。特别是,不应滥用它来修改Map-和Collection-s。
  责备的表达方式:
  ==> lookup?api [在模板[...]

除了在我的<#list lookup?keys as key> ${key} = ${lookup?api.get(key)} </#list> 类中提供其他方法或启用SearchResultContainer(不建议使用)之外,还有其他方法可以访问地图吗?

1 个答案:

答案 0 :(得分:0)

只需启用内置的api。但是,您应该给它一些理由是因为它可能被滥用(很明显),这在模板作者不被完全信任的情况下是一个问题。默认情况下未启用该功能的原因是?api在更早的版本中不存在,因此由于安全性原因,它必须是启用功能。