我在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。
答案 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);