Freemarker и java8 методы по умолчанию?

недавно мы начали использовать методы java 8 по умолчанию в интерфейсах, и похоже, что Freemarker не может их видеть:

${myRatings.notEmpty()}

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

это жаль, потому что мы вызываем кучу методов в наших шаблонах. Есть ли решение этой проблемы? Может, заплатки?

интернеты говорят в основном о методах getFoo() по умолчанию, которые действительно не имеют большого смысла, но я говорю о регулярных вызовах методов, а не о геттерах.

1 ответов


обновление: FreeMarker 2.3.26 представил обходной путь для этого. Цитата из история версий:

FREEMARKER-24: добавлен обходной путь (не включен по умолчанию) для предоставления Java 8 по умолчанию методы (и свойства bean, которые они определяют) для шаблонов, несмотря на это java.beans.Introspector (официальный JavaBeans интроспектор) игнорирует их, как минимум JRE и 1.8.0_66. Чтобы включить этот способ, либо увеличить значение из incompatibleImprovements конструктор аргумент DefaultObjectWrapper или BeansWrapper используется для 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() С добытчиками. Я не знаю, почему разработчики стандартного Java API (или JavaBeans) решили так... Конечно, рано или поздно Freemarker придется сделать дополнительный раунд самоанализа, чтобы обойти эти ограничения JavaBeans.