我们最近开始在界面中使用java 8默认方法,看起来像Freemarker看不到它们:
${myRatings.notEmpty()}
The following has evaluated to null or missing:
==> myRatings.notEmpty
这很遗憾,因为我们在模板中调用了一堆方法。 这个问题有方法解决吗?也许有些补丁?
互联网主要讲的是getFoo()默认方法,这些方法确实没有多大意义,但我说的是常规方法调用,而不是getter。
答案 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的DefaultObjectWrapper
或BeansWrapper
的参数, 或将其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限制。