You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@freemarker.apache.org by "Daniel Dekany (JIRA)" <ji...@apache.org> on 2017/03/10 23:39:04 UTC

[jira] [Resolved] (FREEMARKER-24) Support of default methods in object model

     [ https://issues.apache.org/jira/browse/FREEMARKER-24?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Daniel Dekany resolved FREEMARKER-24.
-------------------------------------
       Resolution: Fixed
         Assignee: Daniel Dekany
    Fix Version/s: 2.3.26-incubating

Quoting from the version history: Added workaround (not enabled by default) to expose Java 8 default methods (and the bean properties they define) to templates, despite that java.beans.Introspector (the official JavaBeans introspector) ignores them, at least as of JRE 1.8.0_66. To enable this workaround, either increase the value of the incompatibleImprovements constructor argument of DefaultObjectWrapper or BeansWrapper the used to 2.3.26, or set its treatDefaultMethodsAsBeanMembers setting to true. Note that if you leave the object_wrapper setting of the Configuration on its default, it's enough to increase the incompatibleImprovements setting of the Configuration to 2.3.26, as that's inherited by the default object_wrapper.

> Support of default methods in object model
> ------------------------------------------
>
>                 Key: FREEMARKER-24
>                 URL: https://issues.apache.org/jira/browse/FREEMARKER-24
>             Project: Apache Freemarker
>          Issue Type: Improvement
>          Components: engine
>    Affects Versions: 2.3.24-incubating
>            Reporter: Emmanuel Keller
>            Assignee: Daniel Dekany
>            Priority: Minor
>             Fix For: 2.3.26-incubating
>
>
> The default object method model currently does not support default methods:
> https://docs.oracle.com/javase/tutorial/java/IandI/defaultmethods.html
> Here is the current error:
> {noformat}
> FTL stack trace ("~" means nesting-related):
> 	- Failed at: #if task.switchable  [in template "...../home.ftl" at line 43, column 25]
> ----
> 	at freemarker.core.InvalidReferenceException.getInstance(InvalidReferenceException.java:131)
> 	at freemarker.core.UnexpectedTypeException.newDesciptionBuilder(UnexpectedTypeException.java:77)
> 	at freemarker.core.UnexpectedTypeException.<init>(UnexpectedTypeException.java:40)
> 	at freemarker.core.NonBooleanException.<init>(NonBooleanException.java:44)
> 	at freemarker.core.Expression.modelToBoolean(Expression.java:142)
> 	at freemarker.core.Expression.evalToBoolean(Expression.java:125)
> 	at freemarker.core.Expression.evalToBoolean(Expression.java:110)
> 	at freemarker.core.ConditionalBlock.accept(ConditionalBlock.java:46)
> 	at freemarker.core.Environment.visit(Environment.java:324)
> 	at freemarker.core.MixedContent.accept(MixedContent.java:54)
> 	at freemarker.core.Environment.visitByHiddingParent(Environment.java:345)
> 	at freemarker.core.IteratorBlock$IterationContext.executeNestedBlockInner(IteratorBlock.java:240)
> 	at freemarker.core.IteratorBlock$IterationContext.executeNestedBlock(IteratorBlock.java:220)
> 	at freemarker.core.IteratorBlock$IterationContext.accept(IteratorBlock.java:194)
> 	at freemarker.core.Environment.visitIteratorBlock(Environment.java:572)
> 	at freemarker.core.IteratorBlock.acceptWithResult(IteratorBlock.java:78)
> 	at freemarker.core.IteratorBlock.accept(IteratorBlock.java:64)
> 	at freemarker.core.Environment.visit(Environment.java:324)
> 	at freemarker.core.MixedContent.accept(MixedContent.java:54)
> 	at freemarker.core.Environment.visit(Environment.java:324)
> 	at freemarker.core.Environment.process(Environment.java:302)
> 	at freemarker.template.Template.process(Template.java:325)
> 	at com.qwazr.tools.FreeMarkerTool.template(FreeMarkerTool.java:86)
> 	at com.qwazr.tools.FreeMarkerTool.template(FreeMarkerTool.java:101)
> {noformat}
> To reproduce this.
> 1. Use an interface
> {code:java}
> public interface UpdatableTask extends Runnable {
>     default boolean isSwitchable() {
>         return false;
>     }
> }
> {code}
> 2. Use an object that implements this interface with the following template:
> {code}
> <#if task.switchable>
> ...
> </#if>
> {code}



--
This message was sent by Atlassian JIRA
(v6.3.15#6346)