2015-05-28 10 views
5

Wir haben in Schnittstellen Java 8 default Methoden zu verwenden, die vor kurzem gestartet und sieht aus wie Freemarker nicht sehen können:Freemarker und Java8 Standardmethoden?

${myRatings.notEmpty()}

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

Das ist schade, weil wir ein paar sind Aufruf Methoden in unseren Vorlagen. Gibt es dafür eine Lösung? Vielleicht ein paar Patches?

Internets sprechen meist von getFoo() Standardmethoden, die zwar nicht viel Sinn machen, aber ich spreche über normale Methodenaufrufe, nicht getters.

+0

@biziclop tat, aber es gibt nicht viel Beispielcode – alamar

Antwort

6

Aktualisierung: FreeMarker 2.3.26 hat eine Abhilfe für dieses Problem eingeführt. Zitiert aus den version history:

FREEMARKER-24: hinzugefügt Abhilfe (standardmäßig nicht aktiviert) Java 8 default Methoden zu belichten (und die Bean-Eigenschaften definieren sie) zu Vorlagen, trotz dass java.beans.Introspector (offiziell Java Beans Introspector) ignoriert sie, zumindest ab JRE 1.8.0_66. Zur Aktivierung dieses Problem zu umgehen, entweder erhöhen den Wert des incompatibleImprovements Konstruktor Argument DefaultObjectWrapper oder BeansWrapper verwendet 2.3.26, oder Set seine treatDefaultMethodsAsBeanMembers Einstellung true. Beachten Sie, dass , wenn Sie die object_wrapper Einstellung der Configuration auf seine Vorgabe, es ist genug, um die incompatibleImprovements Einstellung des Configuration bis 2.3.26, zu erhöhen, wie die durch den Standard object_wrapper geerbt hat.

Ursprüngliche Antwort:

Wie Freemarker Objekte sieht basiert auf der Java Beans-Spezifikation, die ein Eckpfeiler vieler Java-Technologien ist. Es prüft Klassen mit java.beans.Introspector, um Konformität zu gewährleisten. Anscheinend unterstützt JavaBeans keine Java 8-Standardmethoden. BeanInfo.getMethodDescriptors() gibt die Standardmethoden nicht zurück, und wir haben das gleiche Problem mit BeanInfo.getPropertiesDescriptors() mit getters. Ich weiß nicht, warum die Betreuer der Standard-Java-API (oder der JavaBeans) so entschieden haben ... Sicherlich wird Freemarker früher oder später eine zusätzliche Introspektion durchführen müssen, um diese JavaBeans-Einschränkungen zu umgehen.