Spring mvc 无法使用multipartResolver加载freemarker模板
我正在使用Spring MVC应用程序中通过类路径配置的MultipartFile:Spring mvc 无法使用multipartResolver加载freemarker模板,spring-mvc,freemarker,Spring Mvc,Freemarker,我正在使用Spring MVC应用程序中通过类路径配置的MultipartFile: <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <property name="maxUploadSize" value="1000000"/> </bean> <bean id="M
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxUploadSize" value="1000000"/>
</bean>
<bean id="MyController" class="myController">
<property name="myTemplate" value="classpath:myTemplate.txt"/>
</bean>
但是当我运行它时,我得到一个错误:模板类路径:myTemplate.txt找不到
我尝试使用:cfg.setDirectoryForTemplateLoading(myTemplate.getFile().getParentFile())
来确定目录,但也没有帮助
任何想法…?从引用的错误消息中,我想
myTemplate.getFilename()
返回classpath:myTemplate.txt
,而不是myTemplate.txt
。这就解释了为什么即使将模板目录设置为myTemplate.getFile().getParentFile()
,它也不起作用
但这里更根本的问题是,您似乎误用了FreeMarker API。
配置
对象通常在应用程序生命周期中创建一次。这是因为它包含模板缓存。如果您不使用模板缓存,那么您最好将模板加载到字符串
,并使用模板
类构造函数创建模板
。(但是,如果它#包含-s或#导入-s其他模板,那么对于该FreeMarker,它将在内部调用cfg.getTemplate
)。如果您想使用cfg.getTemplate
(以及缓存),那么您可能应该使用理解这些Spring资源名称的TemplateLoader
,然后配置FreeMarker以使用它(cfg.setTemplateLoader(yourTemplateLoader)
)。我不知道Spring是否已经包含了这样的东西,但一般来说,将存储API封装到TemplateLoader
接口并不困难。(从长远来看,这肯定比试图“欺骗”FreeMarker加载带有临时setDirectoryForTemplateLoading
等的模板更容易、更健壮。)我只创建了一次配置对象,这里这样显示是为了尝试简化我正在尝试的操作。我想缩小我的问题范围是:如何在freemarkerAs中使用Spring资源文件作为模板据我所见,在Spring中有一个ResourceLoader
,它可以将资源字符串解析为Resource
对象。因此,您应该实现一个TemplateLoader
,它委托给ResourceLoader
。(当然,除非Spring FreeMarker支持已经实现了这一点。)然后使用cfg.setTemplateLoader(yourResourceTemplateLoader)
。我希望避免开发自己的TemplateLoader。当然有一种方法可以告诉Freemarker从类路径加载模板?确实有,但是Spring资源字符串并不总是以“classpath:”开头,还有谁知道ClassLoader使用的是什么。因此,我的猜测仍然是,最简单、最干净的事情就是将ResourceLoader
包装到TemplateLoader
接口中。也许你已经花了比清洁解决方案更多的时间来寻找解决方案。
public class MyController
{
private Resource myTemplate;
....
Configuration cfg = new Configuration();
Template tpl = cfg.getTemplate(myTemplate.getFilename());