[英]Freemarker and java8 default methods?
我們最近開始在接口中使用java 8默認方法,看起來Freemarker看不到它們:
${myRatings.notEmpty()}
The following has evaluated to null or missing:
==> myRatings.notEmpty
這很遺憾,因為我們在模板中調用了一堆方法。 這個問題有方法解決嗎? 也許一些補丁?
互聯網主要談論 getFoo() 默認方法,這確實沒有多大意義,但我說的是常規方法調用,而不是 getter。
更新: FreeMarker 2.3.26 為此引入了一種解決方法。 引用自版本歷史:
FREEMARKER-24 :添加了解決方法(默認情況下未啟用)以將 Java 8 默認方法(以及它們定義的 bean 屬性)暴露給模板,盡管
java.beans.Introspector
(官方 JavaBeans 內省器)忽略它們,至少從 JRE 開始1.8.0_66。 要啟用此解決方法,請增加用於 2.3.26 的DefaultObjectWrapper
或BeansWrapper
的incompatibleImprovements
構造函數參數的值,或將其treatDefaultMethodsAsBeanMembers
設置設置為true
。 請注意,如果您將Configuration
的object_wrapper
設置保留為默認值,則將Configuration
的incompatibleImprovements
設置增加到 2.3.26 就足夠了,因為它是由默認object_wrapper
繼承的。
原答案:
Freemarker 如何看待對象基於 JavaBeans 規范,這是許多 Java 技術的基石。 它使用java.beans.Introspector
內省類以確保一致性。 顯然,JavaBeans 不支持 Java 8 默認方法。 BeanInfo.getMethodDescriptors()
不返回默認方法,我們在BeanInfo.getPropertiesDescriptors()
和 getter 中也有同樣的問題。 我不知道為什么標准 Java API(或 JavaBeans)的維護者會做出這樣的決定……當然,Freemarker 遲早要進行額外的自省以解決這些 JavaBeans 的限制。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.