与许多Java应用程序一样,我们在应用程序中使用Freemarker呈现电子邮件。我们发现某些模板的渲染不完全符合我们的预期,因此我们意识到我们应该为模板渲染编写一些单元测试。好吧,我设置了测试,并立即收到FileNotFoundException:找不到模板“ my / template.ftl”。
我认为这必须是通过简单的解决方案即可解决的问题。那是很多小时前的工作,我意识到自己错了。据我所知,这既不解决也不容易!
我认为我们应用的设置非常标准。我们有一个Maven项目,并将Freemarker模板存储在src / main / webapp / WEB-INF / freemarker中。尽管我们大多数应用程序的功能都是由Quartz作业启动的,但我们还是将其部署为webapp。因此,我们所需的就是XML XML文件中的以下配置:
<bean id="freemarkerConfiguration"
class="org.springframework.ui.freemarker.FreeMarkerConfigurationFactoryBean">
<property name="templateLoaderPath" value="/WEB-INF/freemarker/" />
</bean>
然后在我们的代码中,我们以如下方式自动装配bean:
@Autowired
protected Configuration freemarkerConfiguration;
并像这样使用它:
Template template = freemarkerConfiguration.getTemplate("mail/job/detail.ftl");
在我们部署的应用程序的上下文中,这非常有效,可以在Quartz作业中执行。但是,从单元测试中运行时,我们总是会找不到模板。
我尝试了许多不同的方法,但没有一种有效。最后一个涉及创建我自己的Freemarker TemplateLoader实现,并试图使其从类路径加载Freemarker模板文件。这种方法的问题是:a)我在测试中其他地方成功使用的相同的类加载代码找不到模板,b)我不确定正确实现TemplateLoader涉及的所有内容,并且c)这一切似乎都没有一般而言过于复杂。
我可以继续这条路线,但首先...我是否缺少明显的东西?Freemarker的好处之一是它不需要HTTP上下文,那么为什么在Web应用程序上下文之外使用Freemarker如此困难?
戴夫
从位置使用的ftl文件src/main/webapp/...
不在classpath中。而且我相信您的测试课程位于src/test/...
无法查看ftl文件(实际上位于中src/main/webapp//WEB-INF/freemarker/mail/job/*.ftl
)的位置,因此您会发现模板未发现异常。如果希望它们位于类路径中,请将文件放在src / test / resources中。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句