[ http://issues.apache.org/struts/browse/WW-1273?page=all ]
     
tm_jee resolved WW-1273:
------------------------

    Resolution: Fixed

> freemarker 'parameters' model attribute - incorrect TemplateModel
> -----------------------------------------------------------------
>
>          Key: WW-1273
>          URL: http://issues.apache.org/struts/browse/WW-1273
>      Project: Struts Action 2
>         Type: Bug

>   Components: Views
>     Versions: WW 2.2.1, WW 2.2.2
>  Environment: FreeMarker 2.3.4, 2.3.6; using recommended FreeMarker 'result 
> type'
>     Reporter: Vladimir Olenin
>     Assignee: tm_jee
>     Priority: Critical
>      Fix For: 2.0

>
> There seems to be a very nasty bug with FreeMarker, which still hasn't been 
> fixed. To access url parameter values one should use 'parameters' variable 
> (btw, this is not documented anywhere, eg, it's not on the 'FreeMarker' 
> integration page in the list of other variable accessible from FreeMarker 
> view).
> The problem with 'parameters' variable is that it seems like incorrect 
> TemplateModel is currently used, specifically 'ArrayModel', while it should 
> be 'HashModel' or smth similar. I'm a novice with FreeMarker, so it might 
> also be something else, but one thing I confirmed is that FreeMarker supplied 
> freemarker.ext.servlet.FreemarkerServlet exposes url parameters through 
> RequestParameters attribute correctly and it is using 
> HttpRequestParametersHashModel).
> This bug makes it currently impossible to access parameter values by name, 
> eg, by using ${parameters.param1} to access 'param1' value in the url 
> http://smth.com/test.action?param1=xxx. The above attempt will result in the 
> following exception:
> ======================================
> Expecting a string, date or number here, Expression parameters.message is 
> instead a freemarker.ext.beans.ArrayModel
> The problematic instruction:
> ----------
> ==> ${parameters.param1} [on line 8, column 13 in test.ftl]
> ----------
> Java backtrace for programmers:
> ----------
> freemarker.core.NonStringException: Error on line 8, column 15 in test.ftl
> Expecting a string, date or number here, Expression parameters.message is 
> instead a freemarker.ext.beans.ArrayModel
>       at freemarker.core.Expression.getStringValue(Expression.java:126)
>       at freemarker.core.Expression.getStringValue(Expression.java:93)
>       at freemarker.core.DollarVariable.accept(DollarVariable.java:76)
>       at freemarker.core.Environment.visit(Environment.java:196)
>       at freemarker.core.MixedContent.accept(MixedContent.java:92)
>       at freemarker.core.Environment.visit(Environment.java:196)
>       at freemarker.core.Environment.process(Environment.java:176)
>       at freemarker.template.Template.process(Template.java:232)
>       at 
> com.opensymphony.webwork.views.freemarker.FreemarkerResult.doExecute(FreemarkerResult.java:130)
>       at 
> com.opensymphony.webwork.dispatcher.WebWorkResultSupport.execute(WebWorkResultSupport.java:101)
>       at 
> com.opensymphony.xwork.DefaultActionInvocation.executeResult(DefaultActionInvocation.java:312)
>       at 
> com.opensymphony.xwork.DefaultActionInvocation.invoke(DefaultActionInvocation.java:207)
>       at 
> com.opensymphony.xwork.interceptor.DefaultWorkflowInterceptor.doIntercept(DefaultWorkflowInterceptor.java:137)
>       at 
> com.opensymphony.xwork.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:81)
>       at 
> com.opensymphony.xwork.DefaultActionInvocation.invoke(DefaultActionInvocation.java:189)
>       at 
> com.opensymphony.xwork.validator.ValidationInterceptor.doIntercept(ValidationInterceptor.java:115)
>       at 
> com.opensymphony.xwork.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:81)
>       at 
> com.opensymphony.xwork.DefaultActionInvocation.invoke(DefaultActionInvocation.java:189)
>       at 
> com.opensymphony.xwork.interceptor.AroundInterceptor.intercept(AroundInterceptor.java:31)
>       at 
> com.opensymphony.xwork.DefaultActionInvocation.invoke(DefaultActionInvocation.java:189)
>       at 
> com.opensymphony.xwork.interceptor.AroundInterceptor.intercept(AroundInterceptor.java:31)
>       at 
> com.opensymphony.xwork.DefaultActionInvocation.invoke(DefaultActionInvocation.java:189)
>       at 
> com.opensymphony.xwork.interceptor.AroundInterceptor.intercept(AroundInterceptor.java:31)
>       at 
> com.opensymphony.xwork.DefaultActionInvocation.invoke(DefaultActionInvocation.java:189)
>       at 
> com.opensymphony.webwork.interceptor.FileUploadInterceptor.intercept(FileUploadInterceptor.java:171)
>       at 
> com.opensymphony.xwork.DefaultActionInvocation.invoke(DefaultActionInvocation.java:189)
>       at 
> com.opensymphony.xwork.interceptor.AroundInterceptor.intercept(AroundInterceptor.java:31)
>       at 
> com.opensymphony.xwork.DefaultActionInvocation.invoke(DefaultActionInvocation.java:189)
>       at 
> com.opensymphony.xwork.interceptor.AroundInterceptor.intercept(AroundInterceptor.java:31)
>       at 
> com.opensymphony.xwork.DefaultActionInvocation.invoke(DefaultActionInvocation.java:189)
>       at 
> com.opensymphony.xwork.interceptor.I18nInterceptor.intercept(I18nInterceptor.java:151)
>       at 
> com.opensymphony.xwork.DefaultActionInvocation.invoke(DefaultActionInvocation.java:189)
>       at 
> com.opensymphony.xwork.interceptor.AroundInterceptor.intercept(AroundInterceptor.java:31)
>       at 
> com.opensymphony.xwork.DefaultActionInvocation.invoke(DefaultActionInvocation.java:189)
>       at 
> com.opensymphony.xwork.interceptor.AroundInterceptor.intercept(AroundInterceptor.java:31)
>       at 
> com.opensymphony.xwork.DefaultActionInvocation.invoke(DefaultActionInvocation.java:189)
>       at 
> com.opensymphony.xwork.interceptor.AroundInterceptor.intercept(AroundInterceptor.java:31)
>       at 
> com.opensymphony.xwork.DefaultActionInvocation.invoke(DefaultActionInvocation.java:189)
>       at 
> com.opensymphony.xwork.interceptor.ExceptionMappingInterceptor.intercept(ExceptionMappingInterceptor.java:100)
>       at 
> com.opensymphony.xwork.DefaultActionInvocation.invoke(DefaultActionInvocation.java:189)
>       at 
> com.opensymphony.xwork.DefaultActionProxy.execute(DefaultActionProxy.java:113)
>       at 
> com.opensymphony.webwork.dispatcher.DispatcherUtils.serviceAction(DispatcherUtils.java:233)
>       at 
> com.opensymphony.webwork.dispatcher.FilterDispatcher.doFilter(FilterDispatcher.java:198)
>       at 
> org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
>       at 
> org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
>       at 
> org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
>       at 
> org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178)
>       at 
> org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126)
>       at 
> org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105)
>       at 
> org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107)
>       at 
> org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148)
>       at 
> org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:856)
>       at 
> org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:744)
>       at 
> org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:527)
>       at 
> org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:80)
>       at 
> org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684)
>       at java.lang.Thread.run(Thread.java:595)
> ============================
> while following call: ${parameters}, will printout what seems to be 
> 'toString' call of List:
> {param1=[Ljava.lang.String;@6210fb, param2=[Ljava.lang.String;@48edb5}
> As I mentioned, if _original Freemarker's_ FreemarkerServlet is used to 
> render the view, variable access like ${RequestParameters.param1} work just 
> fine.

-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
   http://issues.apache.org/struts/secure/Administrators.jspa
-
For more information on JIRA, see:
   http://www.atlassian.com/software/jira


---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to