如何使用Freemarker显示List <map <string,object>&gt;数据</地图<串,对象>

时间:2013-03-18 08:42:52

标签: java freemarker

我在Map中放了两个ArrayList个对象,我想根据arraylist的索引显示不同的数据,java代码如下:

List<Map<String, Object>> value = new ArrayList<Map<String, Object>>();
value.add(originalUnitProps);
value.add(nowUnitProps);

以下是我的模板文件:

<#list value as ori>
    <#if ori_index == 0>

        original info:<br/>

        <#list ori?keys as key>
            ${key}:${ori[key]}  <br/>
        </#list>
    <#else>
        <br/>
        now info:<br/>
        <#list ori?keys as key>
            ${key}:${ori[key]}  <br/>
        </#list>
    </#if>
</#list>

但它会导致异常:

  

java.lang.IllegalArgumentException:freemarker.template.DefaultObjectWrapper无法将java.util.ArrayList转换为TemplateHashModel。

2 个答案:

答案 0 :(得分:3)

问题与您的模板无关。显然,您已将value作为数据模型传递给FreeMarker,但数据模型必须是Map<String, ...>TemplateHashModel。因此,创建Map<String, Object> dataModel,将ArrayList放入具有有意义名称的dataModel.put("infos", value),例如dataModel,将value传递给FreeMarker而不是<#list infos as ...>,然后在模板中使用{{1}}。

此外,如果您有错误消息,请在下次附加整个堆栈跟踪。

答案 1 :(得分:0)

我能够成功运行,使用以下代码设置模型:

Map<String, Object> originalUnitProps = new HashMap<>();
originalUnitProps.put("Lang1", Locale.FRENCH);
originalUnitProps.put("Lang2", Locale.CANADA_FRENCH);

Map<String, Object> nowUnitProps = new HashMap<>();
nowUnitProps.put("Lang3", Locale.ENGLISH);
nowUnitProps.put("Lang4", Locale.GERMAN);

List<Map<String, Object>> value = new ArrayList<Map<String, Object>>();
value.add(originalUnitProps);
value.add(nowUnitProps);

model.put("value", value);