是否可以动态地交替使用来自多个项目的 Freemarker 模板?
Is it possible to dynamically use Freemarker Templates from multiple projects interchangeably?
我有 2 个项目。 项目 A 是一个 Spring 引导应用程序,主要用于编辑和更新信息。 项目 B 有查看信息的方法,我正在尝试将其用作 (A) 的依赖项,以最大化代码重用并最小化努力修复任何 bugs/making 多次改进。
我希望能够让我的控制器和模板正确地动态找到正确的模板。
项目 A 正确地利用了 项目 B 依赖项中的任何 services/daos 等,但我有使前端发挥良好的问题。过去,我有一个没有自己前端的项目使用第二个项目中定义的模板。这就像在我的配置中的 Freemarker @Bean
上设置正确的 TemplateLoaderPath
一样简单。这一次我怀疑,一旦我调用 Project A 的本地模板,它会假设在该上下文路径上也可以找到任何后续模板,而不是在 项目 B
我稍微展示一下项目的结构可能更容易:
src/main/resources/
templates/
feature1/
f1page.ftl
feature2/
f2page.ftl
Maven Dependencies
projectB.jar
templates/
feature3/
f3page.ftl
feature4/
f4page.ftl
我希望当我 return 我的控制器的新 ModelAndView 对象时
return new ModelAndView("feature3/f3page.ftl");
和
return new ModelAndView("feature1/f1page.ftl");
它可以工作,因为两个功能文件夹都位于 templates/
内,尽管位置不同。
值得一提的是,正在进行大量模板导入,因此在这里也需要找到合适的模板。因此,如果 f1page.ftl
(在 src/main/resources 中)有以下行:
<#import "feature3/f3page.ftl" as f3>
这需要在其他位置(在依赖项 .jar 中)找到。
下面是来自该示例的当前 freemarker 堆栈跟踪示例。它似乎在 returning: new ModelAndView("feature1/f1page.ftl");
上找到 f1page.ftl
但找不到 feature3/f3page.ftl
这是第 2 行的导入。
Template importing failed (for parameter value "/feature3/f3page.ftl"): Template not found for name "/feature3/f3page.ftl". The name was interpreted by this TemplateLoader: MultiTemplateLoader(loader1 = FileTemplateLoader(baseDir="C:\Users\Becxxxa\Projects\ProjectA\target\classes\templates", canonicalBasePath="C:\Users\Becxxxa\Projects\ProjectA\target\classes\templates\"), loader2 = ClassTemplateLoader(resourceLoaderClass=org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer, basePackagePath="" /* relatively to resourceLoaderClass pkg */)). ---- FTL stack trace ("~" means nesting-related): - Failed at: #import "/feature3/f3page.ftl" as f3 [in template "feature1/f1page.ftl" at line 2, column 1]
这是我的 @Bean
,如您所见,我已将 setPreferFileSystemAccess
应用到 false
(正如建议 here)但无济于事。
@Bean
public FreeMarkerConfigurationFactoryBean getFreeMarkerConfiguration() {
FreeMarkerConfigurationFactoryBean bean = new FreeMarkerConfigurationFactoryBean();
bean.setTemplateLoaderPath("classpath:/templates/");
bean.setPreferFileSystemAccess(false);
return bean;
}
可能是我对 Freemarker 的要求太高了,这实际上是不可能的。但如果不是,我需要帮助来正确配置我的 project/freemarker 以动态地使用两个模板源。我觉得我可能遗漏了一些关于模板加载的明显内容。
感谢@Taylor O'Connor,虽然这不是解决方案,但我认为我正在寻找一个简单的解决方案来解决看似复杂的问题。
我最终使用 maven-dependency-plugin
将我需要的模板从依赖项解压缩到父项目“src/main/resources/templates”文件夹中。这满足了我不必维护相同代码的多个来源的要求。
这是我添加到我的 pom 的插件:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>unpack</id>
<phase>package</phase>
<goals>
<goal>unpack</goal>
</goals>
<configuration>
<artifactItems>
<artifactItem>
<groupId>uk.co.company</groupId>
<artifactId>projectA</artifactId>
<outputDirectory>src/main/resources/</outputDirectory>
<includes>templates/feature3/**</includes>
<excludes>*/feature4/*</excludes>
</artifactItem>
</artifactItems>
</configuration>
</execution>
</executions>
</plugin>
这会将 feature3
的文件夹放入我的 templates
文件夹中。我不得不排除 feature4
因为它与我的模板文件夹中已有的文件夹的名称相匹配,对我来说这是最好的,因为模板必须略有不同,因为它包含我的 'layout.ftl' 确实不同应用程序之间略有差异。
我有 2 个项目。 项目 A 是一个 Spring 引导应用程序,主要用于编辑和更新信息。 项目 B 有查看信息的方法,我正在尝试将其用作 (A) 的依赖项,以最大化代码重用并最小化努力修复任何 bugs/making 多次改进。
我希望能够让我的控制器和模板正确地动态找到正确的模板。
项目 A 正确地利用了 项目 B 依赖项中的任何 services/daos 等,但我有使前端发挥良好的问题。过去,我有一个没有自己前端的项目使用第二个项目中定义的模板。这就像在我的配置中的 Freemarker @Bean
上设置正确的 TemplateLoaderPath
一样简单。这一次我怀疑,一旦我调用 Project A 的本地模板,它会假设在该上下文路径上也可以找到任何后续模板,而不是在 项目 B
我稍微展示一下项目的结构可能更容易:
src/main/resources/
templates/
feature1/
f1page.ftl
feature2/
f2page.ftl
Maven Dependencies
projectB.jar
templates/
feature3/
f3page.ftl
feature4/
f4page.ftl
我希望当我 return 我的控制器的新 ModelAndView 对象时
return new ModelAndView("feature3/f3page.ftl");
和
return new ModelAndView("feature1/f1page.ftl");
它可以工作,因为两个功能文件夹都位于 templates/
内,尽管位置不同。
值得一提的是,正在进行大量模板导入,因此在这里也需要找到合适的模板。因此,如果 f1page.ftl
(在 src/main/resources 中)有以下行:
<#import "feature3/f3page.ftl" as f3>
这需要在其他位置(在依赖项 .jar 中)找到。
下面是来自该示例的当前 freemarker 堆栈跟踪示例。它似乎在 returning: new ModelAndView("feature1/f1page.ftl");
上找到 f1page.ftl
但找不到 feature3/f3page.ftl
这是第 2 行的导入。
Template importing failed (for parameter value "/feature3/f3page.ftl"): Template not found for name "/feature3/f3page.ftl". The name was interpreted by this TemplateLoader: MultiTemplateLoader(loader1 = FileTemplateLoader(baseDir="C:\Users\Becxxxa\Projects\ProjectA\target\classes\templates", canonicalBasePath="C:\Users\Becxxxa\Projects\ProjectA\target\classes\templates\"), loader2 = ClassTemplateLoader(resourceLoaderClass=org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer, basePackagePath="" /* relatively to resourceLoaderClass pkg */)). ---- FTL stack trace ("~" means nesting-related): - Failed at: #import "/feature3/f3page.ftl" as f3 [in template "feature1/f1page.ftl" at line 2, column 1]
这是我的 @Bean
,如您所见,我已将 setPreferFileSystemAccess
应用到 false
(正如建议 here)但无济于事。
@Bean
public FreeMarkerConfigurationFactoryBean getFreeMarkerConfiguration() {
FreeMarkerConfigurationFactoryBean bean = new FreeMarkerConfigurationFactoryBean();
bean.setTemplateLoaderPath("classpath:/templates/");
bean.setPreferFileSystemAccess(false);
return bean;
}
可能是我对 Freemarker 的要求太高了,这实际上是不可能的。但如果不是,我需要帮助来正确配置我的 project/freemarker 以动态地使用两个模板源。我觉得我可能遗漏了一些关于模板加载的明显内容。
感谢@Taylor O'Connor,虽然这不是解决方案,但我认为我正在寻找一个简单的解决方案来解决看似复杂的问题。
我最终使用 maven-dependency-plugin
将我需要的模板从依赖项解压缩到父项目“src/main/resources/templates”文件夹中。这满足了我不必维护相同代码的多个来源的要求。
这是我添加到我的 pom 的插件:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>unpack</id>
<phase>package</phase>
<goals>
<goal>unpack</goal>
</goals>
<configuration>
<artifactItems>
<artifactItem>
<groupId>uk.co.company</groupId>
<artifactId>projectA</artifactId>
<outputDirectory>src/main/resources/</outputDirectory>
<includes>templates/feature3/**</includes>
<excludes>*/feature4/*</excludes>
</artifactItem>
</artifactItems>
</configuration>
</execution>
</executions>
</plugin>
这会将 feature3
的文件夹放入我的 templates
文件夹中。我不得不排除 feature4
因为它与我的模板文件夹中已有的文件夹的名称相匹配,对我来说这是最好的,因为模板必须略有不同,因为它包含我的 'layout.ftl' 确实不同应用程序之间略有差异。