使用
spring-boot-starter-freemarker
而无需进一步配置,我希望能够从默认模板路径(src/resources/templates
)加载模板(注意它是src/...
而不是build/...
)。
这里有这个文件:
src/resources/templates/emails/welcome.ftl
尝试将其加载为模板:
// some service class
@Autowired
private Configuration freemarkerConfig;
public void doStuff() {
Template t = freemarkerConfig.getTemplate("emails/welcome.ftl");
// ...
}
失败并显示此错误消息:
freemarker.template.TemplateNotFoundException: Template not found for name "emails/welcome.text.ftl".
The name was interpreted by this TemplateLoader: MultiTemplateLoader(loader1 = FileTemplateLoader(baseDir="/some/path/backend/build/resources/main/templates", canonicalBasePath="/some/path/backend/build/resources/main/templates/"), loader2 = ClassTemplateLoader(resourceLoaderClass=org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer, basePackagePath="" /* relatively to resourceLoaderClass pkg */)).
所以配置看起来还不错,但它使用的是
src
文件夹而不是 build
文件夹。当通过./gradlew bootRun
运行时,我们看到错误。执行 ./gradlew build
然后 ./gradlew bootRun
找到模板 - 因为它们现在位于 build
文件夹中。但对于开发来说,如果不需要完全重建,我们将不胜感激。
所以,我知道我们现在可以手动配置 freemarker 以从
src
文件夹加载,但这感觉很hacky。
我做错了什么还是这是预期的行为?
您可以配置
bootRun
以便从源位置加载源。假设模板是主源集的一部分,即它们位于 src/main/resources
中,配置如下:
bootRun {
sourceResources sourceSets.main
}
Spring Boot 的 Gradle 插件的参考文档对此进行了描述。
这是我的代码示例:
FileTemplateLoader templateLoader = new FileTemplateLoader(new File("/Users/user/Downloads/lamoda-monitor 2/src/main/resources"));
configuration.setTemplateLoader(templateLoader);
freemarker.template.Template template = configuration.getTemplate("response.ftl");