簡體   English   中英

將 java.lang.Iterable 視為 Freemarker 中的 #list 表達式

[英]Treat a java.lang.Iterable as a #list expression in Freemarker

我有一個 java.lang.Iterable (實際上是一個 com.google.gson.JsonArray 實例)。

我想使用 freemarker (2.3.16) 枚舉列表中的項目。

[#assign sports = controller.sports]
[#-- At this point, sports is bound to a com.google.gson.JsonArray instance. --]

[#list sports as sport]
  ${sport_index}
[/#list]

我想避免編寫自定義 bean 和 Gson 反序列化器只是為了有一個明確的項目集合。 使用 Gson(對我來說,它已經將 JSON 字符串反序列化為 JsonObject)然后從該 JsonObject 創建我自己的對象 DAG 對我來說似乎很浪費。

不幸的是,我無法找到讓 Freemarker 將 java.lang.Iterable 視為列表的方法。 我得到:

freemarker.template.TemplateException : Expected collection or sequence.
  controller.sports evaluated instead to freemarker.ext.beans.XMLStringModel on line 8, column 16 in sports.html.
freemarker.core.TemplateObject.invalidTypeException(line:135)
freemarker.core.IteratorBlock$Context.runLoop(line:190)
freemarker.core.Environment.visit(line:417)
freemarker.core.IteratorBlock.accept(line:102)
freemarker.core.Environment.visit(line:210)

顯式循環迭代器應該可以工作,例如:

[#list sports.iterator() as sport]
   ${sport_index}
[/#list]

您所要做的就是將JsonArray上的iterator()的結果添加到上下文中。 Freemarker 足夠聰明,可以從那里處理它,你可以在模板中引用它,就像你做任何其他類似列表的變量一樣。

Freemarker 現在通過以下方式創建您的 freemarker 配置來支持Iterable

configuration = new Configuration(VERSION_2_3_28);
DefaultObjectWrapper objectWrapper = new DefaultObjectWrapper(VERSION_2_3_28);
objectWrapper.setIterableSupport(true);
configuration.setObjectWrapper(objectWrapper);

並更新到 2.3.28 版本(我不確定是哪個版本添加了這個,但是 23 沒有它),然后只需實例化您的Template ,傳入該配置即可。

return new Template("somename", someReader, configuration);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM