Freemarker和java8默认方法?

ala*_*mar 8 java freemarker struts2 java-8

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

${myRatings.notEmpty()}

The following has evaluated to null or missing:
==> myRatings.notEmpty
Run Code Online (Sandbox Code Playgroud)

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

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

dde*_*any 9

更新: FreeMarker 2.3.26为此引入了一种解决方法.引自版本历史记录:

FREEMARKER-24:添加了解决方法(默认情况下未启用)以向模板公开Java 8默认方法(以及它们定义的bean属性),尽管java.beans.Introspector(官方JavaBeans内省)忽略它们,至少从JRE 1.8.0_66开始.为了使此解决方案,无论是增加的值incompatibleImprovements的构造器参数DefaultObjectWrapperBeansWrapper用于2.3.26,或它的设置treatDefaultMethodsAsBeanMembers设置true.请注意,如果将object_wrapper设置保留为Configuration默认设置,则足以将incompatibleImprovements设置Configuration增加到2.3.26,因为默认设置继承了该设置 object_wrapper.

原始答案:

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