【问题标题】:Freemarker template not found未找到 Freemarker 模板
【发布时间】:2010-12-20 10:53:59
【问题描述】:

我目前正在尝试让 Freemarker 使用 Spring 与我的应用程序一起工作。无论我尝试什么,我总是找不到模板。我不确定我是否正确设置了配置,但它永远找不到我的模板。这是我的spring bean配置:

<bean id="freemarkerConfig" class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
    <property name="templateLoaderPath" value="/WEB-INF/freemarker/"/>
</bean>

每当我尝试在 freemaker 配置上调用 getTemplate 时,它​​总是会返回一个找不到模板的错误。所以如果我这样做了

configuration.getTemplate("testTemplate.ftl") 

它总是抛出一个 IOException。

我不确定是否有人知道我做错了什么。

感谢您的帮助!

【问题讨论】:

  • 你是如何设置“配置”对象的?
  • 我从 Spring 获取配置对象。FreeMarkerConfigurer 有一个 getConfiguration 方法

标签: java spring freemarker


【解决方案1】:

我刚刚遇到了同样的问题,最后,我决定使用以下方法:

Configuration configuration = new Configuration();
FileTemplateLoader templateLoader = new FileTemplateLoader(new File(YOUR_BASE_TEMPLATE_DIR));
configuration.setTemplateLoader(templateLoader);
freemarker.template.Template template = configuration.getTemplate(YOUR_TEMPLATE_NAME);
template.process(datamodel, writer);

【讨论】:

  • 我试过了,但对我不起作用。我还在现有路径上方收到异常 java.io.FileNotFoundException。这真是太疯狂了!
【解决方案2】:

首先,/WEB-INF/freemarker 只能作为来自WebApplicationContext 内部的路径;否则 Spring 会尝试将其解析为文件系统路径而不是 servlet 上下文路径。您在上面发布的摘录是由DispatcherServlet 加载的上下文吗?

其次,你有什么理由直接使用configuration而不是使用Spring的ViewResolver

最后,IOException 可以表示许多不同的东西。您可以发布完整的堆栈跟踪吗?

【讨论】:

  • 感谢您的回复!我认为存在某种路径问题....所以我正在尝试使用 freemarker 通过使用模板来帮助发送电子邮件。我最初认为 ViewResolver 有点多。所以我认为使用配置会更好......不确定这是否是正确的做法。至于IOException,返回的消息是template not found。
  • 哦,我正在 applicationContext.xml 文件中配置 bean。我没有把它放在 DispatchServlet 中。
  • 如何为“applicationContext.xml”创建上下文(使用什么 Spring 类创建它)?如果它从WebApplicationContext下降,它将能够从“/WEB-INF”获取任何东西——除非你指定一个绝对的文件系统url。
  • 感谢 ChssPly76。我正在使用类路径应用程序上下文来加载我的 applicationContext.xml。我将如何加载 WebApplicationContext?这是在 Web 应用程序中使用的正确上下文吗?
  • 它通常由 DispatcherServlet (static.springsource.org/spring/docs/2.5.x/reference/…) 加载,但您可以手动创建它 (static.springsource.org/spring/docs/2.5.x/api/org/…) 并将 servlet 上下文传递给它。
【解决方案3】:

我认为您必须确保文件“testTemplate.ftl”在文件夹“/WEB-INF/freemarker/”中

【讨论】:

    【解决方案4】:

    你也可以这样设置

        @Bean
        public FreeMarkerConfigurationFactoryBean freemarkerConfiguration() {
            FreeMarkerConfigurationFactoryBean bean = new FreeMarkerConfigurationFactoryBean();
            bean.setTemplateLoaderPath("classpath:/templates/");
            return bean;
        }
    

    在你的情况下:

        <property name="templateLoaderPath" value="classpath:/WEB-INF/freemarker/"/>
    

    【讨论】:

      猜你喜欢
      • 2015-09-04
      • 2014-05-21
      • 2011-07-28
      • 2012-02-12
      • 2015-12-16
      • 2013-03-18
      • 2017-09-15
      • 2010-09-19
      • 1970-01-01
      相关资源
      最近更新 更多