我有一个运行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"));
此外,不再从jar中加载spring.ftl,我必须在我的模板目录中放一个副本才能加载它。
为什么向Configuration
添加FreeMarkerConfigurer
会覆盖我的模板加载器路径?我的设置不正确或Configuration
有更高的优先级吗?
答案 0 :(得分:2)
FreeMarkerConfigurer只是一个工厂,可帮助构建freemarker.template.Configuration
并使用其方法getConfiguration()
公开它。
如果您想进一步配置配置,请先从配置器中提取配置,因为FreeMarker只会使用一个Configuration
。