0

我在一个中放了两个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:&lt;br/>

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

但这会导致异常:

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

4

2 回答 2

3

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

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

于 2013-03-18T21:41:50.500 回答
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);
于 2013-03-23T14:42:16.113 回答