Méthodes par défaut Freemarker et java8?


Nous avons récemment commencé à utiliser des méthodes par défaut java 8 dans les interfaces, et il semble que Freemarker ne puisse pas les voir:

${myRatings.notEmpty()}

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

C'est dommage parce que nous appelons un tas de méthodes dans nos modèles. Est-il une solution à cela? Peut-être quelques patchs?

Les internets parlent principalement de méthodes par défaut getFoo() qui n'ont en effet pas beaucoup de sens, mais je parle d'appels de méthode réguliers, pas de getters.

Author: alamar, 2015-05-28

1 answers

Mise à jour: FreeMarker 2.3.26 a introduit une solution de contournement pour cela. Cité de l'historique des versions :

FREEMARKER-24 : Ajout d'une solution de contournement (non activée par défaut) pour exposer Java 8 par défaut méthodes (et les propriétés de bean qu'ils définissent) aux modèles, malgré cela java.beans.Introspector (l'introspecteur officiel JavaBeans) les ignore, au moins à partir de JRE 1.8.0_66. Pour activer cette solution de contournement, soit augmenter la valeur du constructeur incompatibleImprovements l'argument de DefaultObjectWrapper ou BeansWrapper utilisé pour 2.3.26, ou définissez son paramètre treatDefaultMethodsAsBeanMembers sur true. Notez que si vous laissez le réglage object_wrapper du Configuration sur son par défaut, il suffit d'augmenter le paramètre incompatibleImprovements du Configuration à 2.3.26, comme hérité par défaut object_wrapper.

Réponse originale:

Comment Freemarker voit les objets est basé sur la spécification JavaBeans, qui est une pierre angulaire de nombreuses technologies Java. Il introspecte les classes avec java.beans.Introspector pour assurer la conformité. Apparemment, JavaBeans ne prend pas en charge les méthodes par défaut Java 8. BeanInfo.getMethodDescriptors() ne renvoie pas les méthodes par défaut, et nous avons le même problème avec BeanInfo.getPropertiesDescriptors() avec les getters. Je ne sais pas pourquoi les mainteneurs de l'API Java standard (ou de JavaBeans) ont-ils décidé ainsi... Tôt ou tard, Freemarker devra certainement faire un tour supplémentaire d'introspection pour contourner ces limitations de JavaBeans.

 7
Author: ddekany, 2017-11-14 12:58:25