egervari
Aug 22nd, 2004, 04:37 AM
I have come across a little bug (well, more of an annoyance really) where Spring does not report the true cause of the failure when a freemarker template is not parsed properly. This is a repeatable bug that I've come across at least 6 or 7 times in the last day and it can make working with Freemarker and Spring into a much frustrating endevour.
Here is a simple template that will make it fail.
<#include "/lib/rns.ftl" />
<@html title="${pageTitle}>
<@rnsTransactionListing title="${tableTitle}" transactions=rnsTransactions />
</@html>
Note, you don't need this exact page to make it fail. Notice that the title attribute is missing the ending quote: "${pageTitle}
This is an easy mistake to make however, this gives the following exception:
org.springframework.context.ApplicationContextExce ption: Cannot load FreeMarker
template for URL [core\release.transactions.page.ftl]: Did you specify
the correct template loader path?
at org.springframework.web.servlet.view.freemarker.Fr eeMarkerView.initApplicationContext(FreeMarkerView .java:136)
at org.springframework.context.support.ApplicationObj ectSupport.setApplicationContext(ApplicationObject Support.java:79)
at org.springframework.web.servlet.view.AbstractCachi ngViewResolver.loadAndConfigureView(AbstractCachin gViewResolver.java:123)
at org.springframework.web.servlet.view.AbstractCachi ngViewResolver.resolveViewName(AbstractCachingView Resolver.java:78)
at org.springframework.web.servlet.DispatcherServlet. render(DispatcherServlet.java:629)
at org.springframework.web.servlet.DispatcherServlet. doService(DispatcherServlet.java:535)
at org.springframework.web.servlet.FrameworkServlet.s ervice(FrameworkServlet.java:321)
at javax.servlet.http.HttpServlet.service(HttpServlet .java:103)
at com.caucho.server.dispatch.ServletFilterChain.doFi lter(ServletFilterChain.java:113)
at com.opensymphony.module.sitemesh.filter.PageFilter .parsePage(PageFilter.java:129)
at com.opensymphony.module.sitemesh.filter.PageFilter .doFilter(PageFilter.java:61)
at com.caucho.server.dispatch.FilterFilterChain.doFil ter(FilterFilterChain.java:84)
at com.caucho.server.cache.CacheFilterChain.doFilter( CacheFilterChain.java:211)
at com.caucho.server.webapp.WebAppFilterChain.doFilte r(WebAppFilterChain.java:177)
at com.caucho.server.dispatch.ServletInvocation.servi ce(ServletInvocation.java:221)
at com.caucho.server.http.HttpRequest.handleRequest(H ttpRequest.java:263)
at com.caucho.server.port.TcpConnection.run(TcpConnec tion.java:323)
at com.caucho.util.ThreadPool.runTasks(ThreadPool.jav a:430)
at com.caucho.util.ThreadPool.run(ThreadPool.java:377 )
at java.lang.Thread.run(Thread.java:534)
I assure you, the loader path is not a problem. If one fixes the problem in the template, it will work fine. However, if I re-create the problem, this is what happens:
freemarker.core.ParseException: Encountered "{" at line 5, column 41.
Was expecting:
"=" ...
at freemarker.core.FMParser.generateParseException(FM Parser.java:4411)
at freemarker.core.FMParser.jj_consume_token(FMParser .java:4286)
at freemarker.core.FMParser.NamedArgs(FMParser.java:1 886)
at freemarker.core.FMParser.UnifiedMacroTransform(FMP arser.java:1771)
at freemarker.core.FMParser.FreemarkerDirective(FMPar ser.java:2216)
at freemarker.core.FMParser.Content(FMParser.java:243 3)
at freemarker.core.FMParser.OptionalBlock(FMParser.ja va:2601)
at freemarker.core.FMParser.Root(FMParser.java:2773)
at freemarker.template.Template.<init>(Template.java:144)
at freemarker.cache.TemplateCache.loadTemplate(Templa teCache.java:376)
at freemarker.cache.TemplateCache.getTemplate(Templat eCache.java:347)
at freemarker.cache.TemplateCache.getTemplate(Templat eCache.java:229)
at freemarker.template.Configuration.getTemplate(Conf iguration.java:426)
at freemarker.template.Configuration.getTemplate(Conf iguration.java:398)
at org.springframework.web.servlet.view.freemarker.Fr eeMarkerView.getTemplate(FreeMarkerView.java:168)
at org.springframework.web.servlet.view.freemarker.Fr eeMarkerView.renderMergedTemplateModel(FreeMarkerV iew.java:151)
at org.springframework.web.servlet.view.AbstractTempl ateView.renderMergedOutputModel(AbstractTemplateVi ew.java:160)
at org.springframework.web.servlet.view.AbstractView. render(AbstractView.java:238)
at org.springframework.web.servlet.DispatcherServlet. render(DispatcherServlet.java:644)
at org.springframework.web.servlet.DispatcherServlet. doService(DispatcherServlet.java:535)
at org.springframework.web.servlet.FrameworkServlet.s ervice(FrameworkServlet.java:321)
at javax.servlet.http.HttpServlet.service(HttpServlet .java:103)
As you can see, the correct exception is finally thrown. However, if I restart my server with the template problem intact, it's possible to repeat this resource-loader exception bug.
Motivation for fix? While the exceptions are working just fine if a template is already loaded, it makes debugging *new* pages while the server is running, or even old pages after a restart, very problematic. This template is trivial, however, if it were a library template with 600 lines of code, finding the bug would not be trivial. Even further, I noticed that this happens when a pages includes other templates with errors, even if the main template is syntactically correct.
Anyway, I would really appreciate it if you guys could implement a fix since I have quite a few more templates to make :P
Thanks,
Ken Egervari
Here is a simple template that will make it fail.
<#include "/lib/rns.ftl" />
<@html title="${pageTitle}>
<@rnsTransactionListing title="${tableTitle}" transactions=rnsTransactions />
</@html>
Note, you don't need this exact page to make it fail. Notice that the title attribute is missing the ending quote: "${pageTitle}
This is an easy mistake to make however, this gives the following exception:
org.springframework.context.ApplicationContextExce ption: Cannot load FreeMarker
template for URL [core\release.transactions.page.ftl]: Did you specify
the correct template loader path?
at org.springframework.web.servlet.view.freemarker.Fr eeMarkerView.initApplicationContext(FreeMarkerView .java:136)
at org.springframework.context.support.ApplicationObj ectSupport.setApplicationContext(ApplicationObject Support.java:79)
at org.springframework.web.servlet.view.AbstractCachi ngViewResolver.loadAndConfigureView(AbstractCachin gViewResolver.java:123)
at org.springframework.web.servlet.view.AbstractCachi ngViewResolver.resolveViewName(AbstractCachingView Resolver.java:78)
at org.springframework.web.servlet.DispatcherServlet. render(DispatcherServlet.java:629)
at org.springframework.web.servlet.DispatcherServlet. doService(DispatcherServlet.java:535)
at org.springframework.web.servlet.FrameworkServlet.s ervice(FrameworkServlet.java:321)
at javax.servlet.http.HttpServlet.service(HttpServlet .java:103)
at com.caucho.server.dispatch.ServletFilterChain.doFi lter(ServletFilterChain.java:113)
at com.opensymphony.module.sitemesh.filter.PageFilter .parsePage(PageFilter.java:129)
at com.opensymphony.module.sitemesh.filter.PageFilter .doFilter(PageFilter.java:61)
at com.caucho.server.dispatch.FilterFilterChain.doFil ter(FilterFilterChain.java:84)
at com.caucho.server.cache.CacheFilterChain.doFilter( CacheFilterChain.java:211)
at com.caucho.server.webapp.WebAppFilterChain.doFilte r(WebAppFilterChain.java:177)
at com.caucho.server.dispatch.ServletInvocation.servi ce(ServletInvocation.java:221)
at com.caucho.server.http.HttpRequest.handleRequest(H ttpRequest.java:263)
at com.caucho.server.port.TcpConnection.run(TcpConnec tion.java:323)
at com.caucho.util.ThreadPool.runTasks(ThreadPool.jav a:430)
at com.caucho.util.ThreadPool.run(ThreadPool.java:377 )
at java.lang.Thread.run(Thread.java:534)
I assure you, the loader path is not a problem. If one fixes the problem in the template, it will work fine. However, if I re-create the problem, this is what happens:
freemarker.core.ParseException: Encountered "{" at line 5, column 41.
Was expecting:
"=" ...
at freemarker.core.FMParser.generateParseException(FM Parser.java:4411)
at freemarker.core.FMParser.jj_consume_token(FMParser .java:4286)
at freemarker.core.FMParser.NamedArgs(FMParser.java:1 886)
at freemarker.core.FMParser.UnifiedMacroTransform(FMP arser.java:1771)
at freemarker.core.FMParser.FreemarkerDirective(FMPar ser.java:2216)
at freemarker.core.FMParser.Content(FMParser.java:243 3)
at freemarker.core.FMParser.OptionalBlock(FMParser.ja va:2601)
at freemarker.core.FMParser.Root(FMParser.java:2773)
at freemarker.template.Template.<init>(Template.java:144)
at freemarker.cache.TemplateCache.loadTemplate(Templa teCache.java:376)
at freemarker.cache.TemplateCache.getTemplate(Templat eCache.java:347)
at freemarker.cache.TemplateCache.getTemplate(Templat eCache.java:229)
at freemarker.template.Configuration.getTemplate(Conf iguration.java:426)
at freemarker.template.Configuration.getTemplate(Conf iguration.java:398)
at org.springframework.web.servlet.view.freemarker.Fr eeMarkerView.getTemplate(FreeMarkerView.java:168)
at org.springframework.web.servlet.view.freemarker.Fr eeMarkerView.renderMergedTemplateModel(FreeMarkerV iew.java:151)
at org.springframework.web.servlet.view.AbstractTempl ateView.renderMergedOutputModel(AbstractTemplateVi ew.java:160)
at org.springframework.web.servlet.view.AbstractView. render(AbstractView.java:238)
at org.springframework.web.servlet.DispatcherServlet. render(DispatcherServlet.java:644)
at org.springframework.web.servlet.DispatcherServlet. doService(DispatcherServlet.java:535)
at org.springframework.web.servlet.FrameworkServlet.s ervice(FrameworkServlet.java:321)
at javax.servlet.http.HttpServlet.service(HttpServlet .java:103)
As you can see, the correct exception is finally thrown. However, if I restart my server with the template problem intact, it's possible to repeat this resource-loader exception bug.
Motivation for fix? While the exceptions are working just fine if a template is already loaded, it makes debugging *new* pages while the server is running, or even old pages after a restart, very problematic. This template is trivial, however, if it were a library template with 600 lines of code, finding the bug would not be trivial. Even further, I noticed that this happens when a pages includes other templates with errors, even if the main template is syntactically correct.
Anyway, I would really appreciate it if you guys could implement a fix since I have quite a few more templates to make :P
Thanks,
Ken Egervari