2015-05-28 30 views
5

Abbiamo recentemente iniziato a utilizzare Java 8 metodi predefiniti nelle interfacce, e si presenta come Freemarker non può vederli:Metodi predefiniti di Freemarker e java8?

${myRatings.notEmpty()}

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

Questo è un peccato perché stiamo chiamando un gruppo di metodi nei nostri modelli. C'è una soluzione a questo? Forse alcune patch?

Gli internet parlano per lo più di metodi predefiniti getFoo() che in effetti non hanno molto senso, ma sto parlando di normali chiamate di metodo, non di getter.

+0

@biziclop lo ha fatto, ma non c'è molto codice di esempio – alamar

risposta

6

Aggiornamento: FreeMarker 2.3.26 ha introdotto una soluzione alternativa per questo. Citato dal version history:

FREEMARKER-24: Aggiunta una soluzione (non abilitato per impostazione predefinita) per esporre Java 8 di default metodi (e le proprietà di fagioli che definiscono) ai modelli, nonostante che java.beans.Introspector (il JavaBeans Introspector ufficiale) li ignora, almeno a partire da JRE 1.8.0_66. Per attivare questa soluzione, o aumentare il valore del incompatibleImprovements costruzione argomento DefaultObjectWrapper o BeansWrapper utilizzato per 2.3.26, o impostare l'impostazione treatDefaultMethodsAsBeanMembers a true. Si noti che se si lascia l'impostazione object_wrapper del Configuration sul suo di default, è sufficiente per aumentare l'impostazione incompatibleImprovements del Configuration a 2.3.26, come quello ereditato dalla predefinita object_wrapper.

risposta originale:

Come Freemarker vede gli oggetti si basa sulla specifica JavaBeans, che è una pietra angolare di molte tecnologie Java. Introspezione delle classi con java.beans.Introspector per garantire la conformità. Apparentemente, JavaBeans non supporta i metodi predefiniti di Java 8. BeanInfo.getMethodDescriptors() non restituisce i metodi predefiniti e abbiamo lo stesso problema con BeanInfo.getPropertiesDescriptors() con getter. Non so perché i manutentori dell'API Java standard (o di JavaBeans) abbiano deciso così ... Certamente prima o poi Freemarker dovrà fare un ulteriore giro di introspezione per aggirare queste limitazioni di JavaBeans.