Freemarker和java8默认方法?

Freemarker和java8默认方法?,java,struts2,java-8,freemarker,Java,Struts2,Java 8,Freemarker,我们最近开始在接口中使用java 8默认方法,看起来Freemarker无法看到它们: ${myRatings.notEmpty()} 这很遗憾,因为我们在模板中调用了一堆方法。 有解决办法吗?也许有补丁 Internet主要谈论getFoo()默认方法,这些方法确实没有多大意义,但我谈论的是常规方法调用,而不是getter。更新:FreeMarker 2.3.26为此引入了一种解决方法。引自: :添加了用于公开Java 8默认值的变通方法(默认情况下未启用) 方法(以及它们定义的bean属性)

我们最近开始在接口中使用java 8默认方法,看起来Freemarker无法看到它们:

${myRatings.notEmpty()}

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


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

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

:添加了用于公开Java 8默认值的变通方法(默认情况下未启用) 方法(以及它们定义的bean属性)到模板,尽管 那是
java.beans.Introspector
(正式的JavaBeans内省器) 忽略它们,至少从JRE 1.8.0_66开始。要启用此解决方案, 增加
不兼容改进
构造函数的值 用于2.3.26的
DefaultObjectWrapper
BeansWrapper
的参数, 或者将其
treatDefaultMethodsAsBeanMembers
设置设置为
true
。注意 如果将
配置的
对象包装器设置保留在
默认情况下,这足以增加
不兼容改进
设置 将
配置的
修改为2.3.26,这是默认继承的
对象包装器

原始答复:


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

@biziclop这样做了,但没有太多示例代码
The following has evaluated to null or missing:
==> myRatings.notEmpty