freemarker.template.TemplateModelException when using Stripes LayoutRenderTag
with Freemarker 2.3.18
----------------------------------------------------------------------------------------------------
Key: STS-861
URL: http://www.stripesframework.org/jira/browse/STS-861
Project: Stripes
Issue Type: Bug
Components: Tag Library
Affects Versions: Release 1.5.6, Release 1.5.5, Release 1.5.4
Environment: Freemarker 2.3.18
Stripes 1.5.6
Reporter: Haggi
We managed Stripes LayoutRenderTag to work with the latest version of
Freemarker 2.3.x. without the need of a dynamic attribute to be set. Freemarker
throws some curious exception when using the LayoutRenderTag without a dynamic
attribute.
It's because Stripes overrides the Tagwriter instance of Freemarker in the
getContext() method of the LayoutRenderTag class within the doStartTag()
method. That's a problem because Freemarks checks if the Writer (Tagwriter)
before the Tag is called is the same like after Tag processing.
If you set a dynamic attribute on the layout-render tag the getContext() method
in LayoutRenderTag is called within the setDynamicAttribute() method and before
the doStartTag() method is invoked. If the LayoutContext is initialized before
the doStartTag() method is invoked all goes fine.
So i override the setPageContext() method within the LayoutRenderTag class and
call the getContext() method before anything else is invoked.
{code:title=LayoutRenderTag.java|borderStyle=solid}
@Override
public void setPageContext(PageContext pageContext) {
super.setPageContext(pageContext);
this.getContext();
}
{code}
Here is the layout used in my tests:
{code:title=layout.ftl with the layout-definition|borderStyle=solid}
<#ftl>
<#assign s=JspTaglibs["http://stripes.sourceforge.net/stripes.tld"]/>
<@s["layout-definition"]>
HEAD: <@s["layout-component"] name="html_head" /><br/>
BODY: <@s["layout-component"] name="body" />
</@>
{code}
{code:title=test.ftl with the layout-render|borderStyle=solid}
<#ftl>
<#assign s=JspTaglibs["http://stripes.sourceforge.net/stripes.tld"]/>
<@s["layout-render"] name="/web/manager/layout/default.ftl">
<@s["layout-component"] name="html_head">
Here is the head
</@>
<@s["layout-component"] name="body">
Here is the body
</@>
</@>
{code}
There some other really annoying problems when using Stripes and Freemarker we
have managed to go away.
{code}
12:58:42 WARN: freemarker.jsp - Tag.SKIP_PAGE was ignored from a
net.sourceforge.stripes.tag.layout.LayoutDefinitionTag tag.
{code}
This execption is raised because of the SKIP_PAGE return value in
LayoutDefinitionTag class in the doEndTag() method.
I change the return value in EVAL_PAGE to prevent the output of the WARN
message.
and
in the LayoutWriter class the flush() method throw an unhandled exception
NullPointerException because the expected Writer is null. The root cause is
unknown, but i added a null-check to prevent this WARN message too.
After that all pages renders fine, i can use Freemarker templates with layout
tags of Stripes.
{code}
12:58:42 WARN: net.sourceforge.stripes.exception.DefaultExceptionHandler -
Unhandled exception caught by the Stripes default exception handler.
java.lang.NullPointerException
at
net.sourceforge.stripes.tag.layout.LayoutWriter.flush(LayoutWriter.java:125)
at freemarker.ext.jsp.JspWriterAdapter.flush(JspWriterAdapter.java:40)
at
net.sourceforge.stripes.tag.layout.LayoutWriter.tryFlush(LayoutWriter.java:108)
at
net.sourceforge.stripes.tag.layout.LayoutWriter.setSilent(LayoutWriter.java:70)
at
net.sourceforge.stripes.tag.layout.LayoutRenderTag.doEndTag(LayoutRenderTag.java:189)
at
freemarker.ext.jsp.TagTransformModel$TagWriter.endEvaluation(TagTransformModel.java:430)
at
freemarker.ext.jsp.TagTransformModel$TagWriter.afterBody(TagTransformModel.java:406)
at freemarker.core.Environment.visit(Environment.java:312)
at freemarker.core.UnifiedCall.accept(UnifiedCall.java:130)
at freemarker.core.Environment.visit(Environment.java:221)
at freemarker.core.MixedContent.accept(MixedContent.java:92)
at freemarker.core.Environment.visit(Environment.java:221)
at freemarker.core.Environment.process(Environment.java:199)
at freemarker.template.Template.process(Template.java:237)
at
freemarker.ext.servlet.FreemarkerServlet.process(FreemarkerServlet.java:452)
at
freemarker.ext.servlet.FreemarkerServlet.doGet(FreemarkerServlet.java:391)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
at
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:304)
at
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at
org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:684)
at
org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:471)
at
org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:402)
at
org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:329)
at
net.sourceforge.stripes.action.ForwardResolution.execute(ForwardResolution.java:110)
at
net.sourceforge.stripes.controller.DispatcherHelper$7.intercept(DispatcherHelper.java:508)
at
net.sourceforge.stripes.controller.ExecutionContext.proceed(ExecutionContext.java:158)
at
org.stripesstuff.plugin.security.SecurityInterceptor.intercept(SecurityInterceptor.java:140)
at
net.sourceforge.stripes.controller.ExecutionContext.proceed(ExecutionContext.java:155)
at
net.sourceforge.stripes.controller.HttpCacheInterceptor.intercept(HttpCacheInterceptor.java:99)
at
net.sourceforge.stripes.controller.ExecutionContext.proceed(ExecutionContext.java:155)
at
net.sourceforge.stripes.controller.BeforeAfterMethodInterceptor.intercept(BeforeAfterMethodInterceptor.java:113)
at
net.sourceforge.stripes.controller.ExecutionContext.proceed(ExecutionContext.java:155)
at
net.sourceforge.stripes.controller.ExecutionContext.wrap(ExecutionContext.java:74)
at
net.sourceforge.stripes.controller.DispatcherHelper.executeResolution(DispatcherHelper.java:502)
at
net.sourceforge.stripes.controller.DispatcherServlet.executeResolution(DispatcherServlet.java:286)
at
net.sourceforge.stripes.controller.DispatcherServlet.service(DispatcherServlet.java:170)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
at
net.sourceforge.stripes.controller.DynamicMappingFilter$2.doFilter(DynamicMappingFilter.java:431)
at
net.sourceforge.stripes.controller.StripesFilter.doFilter(StripesFilter.java:247)
at
net.sourceforge.stripes.controller.DynamicMappingFilter.doFilter(DynamicMappingFilter.java:418)
at
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
at
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at
org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:224)
at
org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:169)
at
org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
at
org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
at
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
at
org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:929)
at
org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:405)
at
org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:964)
at
org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:515)
at
org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:302)
at
java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:619)
{code}
--
This message is automatically generated by JIRA.
-
For more information on JIRA, see: http://www.atlassian.com/software/jira
------------------------------------------------------------------------------
All the data continuously generated in your IT infrastructure
contains a definitive record of customers, application performance,
security threats, fraudulent activity, and more. Splunk takes this
data and makes sense of it. IT sense. And common sense.
http://p.sf.net/sfu/splunk-novd2d
_______________________________________________
Stripes-development mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/stripes-development