java - 是否可以动态地交替使用多个项目中的 Freemarker 模板?

标签 java spring-boot dependency-injection freemarker contextpath

我有 2 个项目。 项目 A 是一个 Spring Boot 应用程序,主要关注编辑和更新信息。 项目 B 可以查看信息,我尝试将其用作 (A) 的依赖项,以最大限度地提高代码重用性并最大限度地减少修复任何错误的工作量/多次进行任何改进。

我希望能够让我的 Controller 和模板正确动态地找到正确的模板。

项目 A 正确地使用了 项目 B 依赖项中的任何服务/daos 等,但我在使前端正常运行时遇到了问题。过去,我有一个没有自己前端的项目使用第二个项目中定义的模板。这就像设置正确的 TemplateLoaderPath 一样简单在 Freemarker 上 @Bean在我的配置中。这次我怀疑,一旦我调用项目 A 本地的模板,它就会假设任何后续模板也可以在该上下文路径上找到,而不是在项目 B 中查找

对我来说,稍微显示项目的结构可能会更容易:

src/main/resources/ templates/ feature1/ f1page.ftl feature2/ f2page.ftl Maven Dependencies projectB.jar templates/ feature3/ f3page.ftl feature4/ f4page.ftl

我希望当我为 Controller 返回新的 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 堆栈跟踪的示例。好像找到f1page.ftl返回后:new ModelAndView("feature1/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如你所见,我已经申请了setPreferFileSystemAccessfalse (正如建议的 here )但无济于事。

@Bean public FreeMarkerConfigurationFactoryBean getFreeMarkerConfiguration() { FreeMarkerConfigurationFactoryBean bean = new FreeMarkerConfigurationFactoryBean(); bean.setTemplateLoaderPath("classpath:/templates/"); bean.setPreferFileSystemAccess(false); return bean; }

可能是我对 Freemarker 的要求太多了,而这实际上是不可能的。但如果没有,我需要帮助来正确配置我的项目/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”应用程序之间确实略有不同。

关于java - 是否可以动态地交替使用多个项目中的 Freemarker 模板?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55590919/

相关文章:

java - 如何使用guice注入(inject)将Class注入(inject)到具有静态方法的类中?

java - 据说 `libX11`不是线程安全的。这是否意味着我不能将 Java AWT 与其他也使用 X11 的东西(例如 Qt)混合使用?

java - 如何在任何应用程序的 JAR 文件中绑定(bind) MySql 数据库?

java - 如何使进度条前进

java - Spring Boot - 无法解决 Whitelabel 错误页面

java - Oauth2 拒绝登录页面请求我该如何修复

asp.net-mvc - 使用 DI ninject 的自定义角色提供程序抛出错误

java - 无法运行 Ofbiz POS

json - 将所有json对象存储到MongoDB中

java - ProvisionException 使用 PlayFramework 2.4.2