阻止FreeMarker在SimpleSequence中包装一个实现Collection的类

时间:2010-08-20 15:34:05

标签: freemarker

我有一个Page类实现java.util.Collection以及其他方法,例如hasPreviousPagegetTotalPages等.Freemarker将此类包装在SimpleSequence中。这将隐藏不属于java.util.Collection的方法。

即。当我写${page.getTotalPages()}时,我收到了这个错误:

  

预期哈希。 myPage 评估为freemarker.template.SimpleSequence [...]

如何告诉Freemarker公开迭代 Collection 的方法,以便<#list page as item>这样的代码继续工作,以及自定义代码?

感谢您的任何建议/参考。

2 个答案:

答案 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),您就不必在任何地方触摸应用程序代码。