Freemarker和java8默认方法?

时间:2015-05-28 10:27:03

标签: java struts2 java-8 freemarker

我们最近开始在界面中使用java 8默认方法,看起来像Freemarker看不到它们:

${myRatings.notEmpty()}

The following has evaluated to null or missing:
==> myRatings.notEmpty

这很遗憾,因为我们在模板中调用了一堆方法。 这个问题有方法解决吗?也许有些补丁?

互联网主要讲的是getFoo()默认方法,这些方法确实没有多大意义,但我说的是常规方法调用,而不是getter。

1 个答案:

答案 0 :(得分:7)

更新:FreeMarker 2.3.26为此引入了一种解决方法。引自version history

  

FREEMARKER-24:添加了解决方法(默认情况下未启用)以公开Java 8默认值   尽管如此,方法(以及它们定义的bean属性)仍然适用于模板   java.beans.Introspector(官方JavaBeans内省)   忽略它们,至少从JRE 1.8.0_66开始。要启用此解决方法,   或者增加incompatibleImprovements构造函数的值   用于2.3.26的DefaultObjectWrapperBeansWrapper的参数,   或将其treatDefaultMethodsAsBeanMembers设置为true。注意   如果您将object_wrapper设置为Configuration   默认情况下,它足以增加incompatibleImprovements设置   Configuration到2.3.26,由默认值继承   object_wrapper

原始答案:

Freemarker如何看待对象基于JavaBeans规范,这是许多Java技术的基石。它会使用java.beans.Introspector对类进行内省,以确保符合性。显然,JavaBeans不支持Java 8默认方法。 BeanInfo.getMethodDescriptors()没有返回默认方法,我们在使用getter的BeanInfo.getPropertiesDescriptors()时遇到了同样的问题。我不知道为什么标准Java API(或JavaBeans)的维护者会这样决定......当然,Freemarker迟早要做一些额外的内省来解决这些JavaBeans限制。