2015-05-28 6 views
5

Мы недавно начали использовать Java 8 стандартных методов в интерфейсах, и выглядит как Freemarker не может их видеть:Freemarker и методы java8 по умолчанию?

${myRatings.notEmpty()}

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

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

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

+0

@biziclop сделал так, но кода примера не так много – alamar

ответ

6

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

FREEMARKER-24: Добавлен обход (не включена по умолчанию), чтобы выставить Java 8 по умолчанию методы (и свойства компонента они определяют) в шаблоны, несмотря на что java.beans.Introspector (официальный JavaBeans Introspector) игнорирует их, по крайней мере, из 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.

Смежные вопросы