Spring FreeMarkerConfiguration模板加载器路径被配置覆盖

时间:2014-08-15 08:35:43

标签: spring spring-mvc freemarker

我有一个运行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有更高的优先级吗?

1 个答案:

答案 0 :(得分:2)

FreeMarkerConfigurer只是一个工厂,可帮助构建freemarker.template.Configuration并使用其方法getConfiguration()公开它。

如果您想进一步配置配置,请先从配置器中提取配置,因为FreeMarker只会使用一个Configuration