未找到 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