我有一个Page
类实现java.util.Collection
以及其他方法,例如hasPreviousPage
,getTotalPages
等.Freemarker将此类包装在SimpleSequence
中。这将隐藏不属于java.util.Collection
的方法。
即。当我写${page.getTotalPages()}
时,我收到了这个错误:
预期哈希。 myPage 评估为freemarker.template.SimpleSequence [...]
如何告诉Freemarker公开迭代 Collection 的方法,以便<#list page as item>
这样的代码继续工作,以及自定义代码?
感谢您的任何建议/参考。
答案 0 :(得分:3)
两个想法,虽然没有人回答你的问题(这似乎很明智)。
1)我认为您可以使用${page.totalPages}
代替${page.getTotalPages()}
。
2)考虑Page
包含集合对象是否有意义(所以你使用<#list page.items as item>
)而不是实现Collection,这是一个不同寻常的如果您实际上没有创建新的集合数据结构。
答案 1 :(得分:1)
如果您不能或不应该更改该类...您可以扩展DefaultObjectWrapper或BeansWrapper,以便它专门处理某些类。 DefaultObjectWrapper本身就是这样做的一个例子(它专门包装了DOM对象和Jython对象)。您可以使用BeanModel来扭曲对象,但添加一个名为“items”的额外子变量,它返回相同的对象但包装到SimpleSeqence中。然后,您只需将FreeMarker配置为全局使用自定义ObjectWrapper(Configuration.setObjectWrapper),您就不必在任何地方触摸应用程序代码。