未找到 Freemarker 模板

Posted

技术标签:

【中文标题】未找到 Freemarker 模板【英文标题】:Freemarker template not found 【发布时间】: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 方法 【参考方案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/"/>

【讨论】:

以上是关于未找到 Freemarker 模板的主要内容,如果未能解决你的问题,请参考以下文章

在 java 中加载 freemarker 模板时出现 FileNotFoundException

在 Freemarker 中使用 NetSuite 日期

如何使用 java 将 spring 标记库公开给 Freemaker 配置并处理 Freemarker 模板类?

freemarker设置模板路径问题

在 Freemarker 中取消分配普通变量

freemarker如何遍历模板中所有变量