JMill - 2014-12-27

Using Tiles 3 in combination with Freemarker within Spring MVC. According to this unanswered post (see here http://tinyurl.com/okehanq) cause of the exception is due to "exposeSpringMacroHelpers" property not set to true.

I came across a post (see here https://ehc.ac/p/freemarker/discussion/2346/thread/7c922d1c/) which mentions using the full namespace e.g. "<#import "/org/springframework/web/servlet/view/freemarker/spring.ftl" as spring/>", which seems work for me too but haven't a clue why "/spring.ftl" fails.

Exception

...
Caused by: javax.servlet.ServletException: Error executing FreeMarker template
at freemarker.ext.servlet.FreemarkerServlet.process(FreemarkerServlet.java:463) ~[freemarker-2.3.20.jar:2.3.20]
at freemarker.ext.servlet.FreemarkerServlet.doGet(FreemarkerServlet.java:391) ~[freemarker-2.3.20.jar:2.3.20]
at org.apache.tiles.request.freemarker.render.FreemarkerRenderer.render(FreemarkerRenderer.java:73) ~[tiles-request-freemarker-1.0.6.jar:1.0.6]
... 83 common frames omitted
Caused by: freemarker.core._MiscTemplateException: Error reading imported template spring.ftl

The failing instruction:
==> #import "/spring.ftl" as spring [in template "WEB-INF/layouts/default.ftl" at line 2, column 1]
at freemarker.core.LibraryLoad.accept(LibraryLoad.java:118) ~[freemarker-2.3.20.jar:2.3.20]
at freemarker.core.Environment.visit(Environment.java:265) ~[freemarker-2.3.20.jar:2.3.20]
at freemarker.core.MixedContent.accept(MixedContent.java:93) ~[freemarker-2.3.20.jar:2.3.20]
at freemarker.core.Environment.visit(Environment.java:265) ~[freemarker-2.3.20.jar:2.3.20]
at freemarker.core.Environment.process(Environment.java:243) ~[freemarker-2.3.20.jar:2.3.20]
at freemarker.template.Template.process(Template.java:277) ~[freemarker-2.3.20.jar:2.3.20]
at freemarker.ext.servlet.FreemarkerServlet.process(FreemarkerServlet.java:452) ~[freemarker-2.3.20.jar:2.3.20]
... 85 common frames omitted
Caused by: java.io.FileNotFoundException: Template "spring.ftl" not found.
at freemarker.template.Configuration.getTemplate(Configuration.java:742) ~[freemarker-2.3.20.jar:2.3.20]
at freemarker.core.Environment.getTemplateForInclusion(Environment.java:1694) ~[freemarker-2.3.20.jar:2.3.20]
at freemarker.core.Environment.getTemplateForImporting(Environment.java:1748) ~[freemarker-2.3.20.jar:2.3.20]
at freemarker.core.LibraryLoad.accept(LibraryLoad.java:111) ~[freemarker-2.3.20.jar:2.3.20]
... 91 common frames omitted
Config Class

@Bean
public UrlBasedViewResolver tilesViewResolver(){
UrlBasedViewResolver urlBasedViewResolver = new UrlBasedViewResolver();
urlBasedViewResolver.setViewClass(FreemarkerTilesView.class);
return urlBasedViewResolver;
}

@Bean
public TilesConfigurer tilesConfigurer(){
TilesConfigurer tilesConfigurer = new TilesConfigurer();
tilesConfigurer.setCompleteAutoload(true);
return tilesConfigurer;
}

Template (default.ftl)

<html lang="en">
<#import "/spring.ftl" as spring />
...
</html>
Sample Project

I have attached a small project to demonstrate the problem.

 

Last edit: JMill 2014-12-28