【发布时间】:2014-08-15 08:35:43
【问题描述】:
我有一个使用 Spring 4 运行的基于 Java 的 Web 应用程序。我将 FreeMarker 用于我的 Web 模板。我的 WebConfig 类使用 FreeMarkerConfigurer 对象来设置我的模板加载器路径和其他一些设置:
@Bean
public FreeMarkerConfigurer freemarkerConfig() throws IOException {
FreeMarkerConfigurer fmc = new FreeMarkerConfigurer();
fmc.setTemplateLoaderPath("/WEB-INF/templates");
fmc.setDefaultEncoding("UTF-8");
Properties settings = new Properties();
settings.setProperty("date_format", "dd MMM yyyy");
fmc.setFreemarkerSettings(settings);
return fmc;
}
这工作正常:视图正确解析,包括可以从 jar 加载的任何 <#import 'spring.ftl' as spring> 指令。
现在我想更多地自定义我的应用程序,例如设置自定义模板异常处理程序。我创建了一个 FreeMarker Configuration 对象并将其添加到 FreeMarkerConfigurer:
Configuration cfg = new Configuration();
cfg.setTemplateExceptionHandler(new MyTemplateExceptionHandler());
fmc.setConfiguration(cfg);
但这阻止了我的视图解析 - 它似乎覆盖了 FreeMarkerConfigurer 对象中的 TemplateLoaderPath,我必须在 Configuration 实例中显式设置路径,而不是让我的模板被项目定位:
cfg.setDirectoryForTemplateLoading(new File("C:/myProject/WEB-INF/templates"));
此外,spring.ftl 不再从 jar 加载,我必须在模板目录中放置一个副本才能加载它。
为什么将Configuration 添加到FreeMarkerConfigurer 会覆盖我的模板加载器路径?是我的设置不正确还是Configuration 具有更高的优先级?
【问题讨论】:
标签: spring spring-mvc freemarker