【问题标题】:Freemarker and java8 default methods?Freemarker 和 java8 的默认方法?
【发布时间】:2015-08-10 19:17:22
【问题描述】:

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

${myRatings.notEmpty()}

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

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

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

【问题讨论】:

  • @biziclop 这样做了,但没有太多示例代码

标签: java struts2 java-8 freemarker


【解决方案1】:

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

FREEMARKER-24:添加了解决方法(默认情况下未启用)以公开 Java 8 默认值 方法(以及它们定义的 bean 属性)到模板,尽管 java.beans.Introspector(官方 JavaBeans 内省者) 忽略它们,至少从 JRE 1.8.0_66 开始。要启用此解决方法, 要么增加 incompatibleImprovements 构造函数的值 DefaultObjectWrapperBeansWrapper 的参数用于 2.3.26, 或将其treatDefaultMethodsAsBeanMembers 设置为true。注意 如果您将Configurationobject_wrapper 设置保留在其上 默认,增加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 的限制。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-04
    • 2016-09-06
    • 2014-07-23
    • 2010-11-18
    • 2012-02-12
    • 2017-02-16
    • 2017-08-24
    相关资源
    最近更新 更多