当前位置: 首页 > 知识库问答 >
问题:

是否可以互换地动态使用多个项目中的Freemarker模板?

罗鸿福
2023-03-14

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

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

项目A正确地利用了项目B依赖项中包含的任何服务/DAO等,但我在前端处理方面遇到了问题。在过去,我有一个没有前端的项目使用第二个项目中定义的模板。这很简单,只需在我的配置中的Freemarker Bean上设置正确的TemplateLoaderPath即可。这一次,我怀疑,一旦我调用了项目a的本地模板,就会假定在该上下文路径上也会找到任何子数量模板,而不是在项目B中查找

我可能更容易显示项目的结构:

src/main/resources/templates/feature1/f1页。ftl功能2/2页。ftl Maven Dependencies项目B。jar模板/功能3/F3页。ftl功能4/F4第页。ftl

我希望当我为我的控制器返回新的ModelAndView对象时

返回新的ModelAndView(“feature3/f3page.ftl”)

返回新的ModelAndView(“feature1/f1page.ftl”) 它可以工作,因为两个功能文件夹都位于不同的位置。

值得一提的是,有很多模板导入正在进行,因此在这里也需要找到正确的模板。因此,如果f1page.ftl(在src/main/Resources中)有以下行:

<代码>

下面是此示例中当前freemarker堆栈跟踪的示例。似乎找到了F1页。ftl返回时:新模型和视图(“feature1/f1page.ftl”) 但找不到功能3/F3页。ftl是第2行的导入。

<代码>模板导入失败(对于参数值“/feature3/f3page.ftl”):找不到名称“/feature3/f3page.ftl”的模板。此模板加载程序解释了该名称:MultiTemplateLoader(加载程序1=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.freemarkerconfiguer,basePackagePath=“”/*相对于resourceLoaderClass pkg*/)。---FTL堆栈跟踪(“~”表示嵌套相关):-在以下位置失败:#导入“/feature3/f3page.FTL”作为f3[在模板“feature1/f1page.FTL”的第2行第1列]

这是我的@Bean,您可以看到我已经将设置首选文件系统访问(setPreferFileSystemAccess)应用于错误(正如这里所建议的那样),但没有任何效果。

<代码>@Bean public FreeMarkerConfigurationFactoryBean getFreeMarkerConfiguration(){FreeMarkerConfigurationFactoryBean=new FreeMarkerConfigurationFactoryBean();Bean.setTemplateLoaderPath(“classpath:/templates/”);Bean.setPreferFileSystemAccess(false);return Bean;}

有可能我对Freemarker要求太多,而这实际上是不可能的。但如果不是,我需要帮助来正确配置我的项目/freemarker,以便动态地使用这两个模板源。我觉得我可能在模板加载方面遗漏了一些明显的东西。


共有1个答案

陶泳
2023-03-14

感谢@Taylor O'Connor,尽管这不是我认为我在寻找的解决方案,但它是一个简单的解决方案,可以解决看似复杂的问题。

最后,我使用maven依赖插件将所需的模板从依赖项解包到父项目的“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>

这会将功能3的文件夹放入我的模板文件夹中。我不得不排除feature4,因为它与我的templates文件夹中已有的文件夹名称相匹配,对我来说,这是最好的,因为模板必须略有不同,因为它包含我的“布局”。ftl’这在不同的应用中略有不同。

 类似资料:
  • 问题内容: 我正在尝试设置一些环境变量(用于对dev / prod端点进行API调用,取决于dev / prod等的键等),我想知道使用dotenv是否行得通。 我已经安装了dotenv,并且正在使用webpack。 我的webpack条目是,因此在该文件中 然后,在我的webpack配置中,输入以下内容: 但是,它仍未定义。如何正确执行此操作? 问题答案: 最简洁的答案是不。浏览器无法访问本地或

  • 我在导航图中实现了一个嵌套图,它有两个图。在第一个图中,有3个片段,在第二个图中,有2个片段。图2包含在图1中。我想导航到(图1步骤1)到(图2步骤2)。我们不能定义两个嵌套片段之间的动作。那么,有什么方法可以将动态目的地分配给导航? 图1 图2 我已经检查了这个解决方案,但它不适用于嵌套图!

  • https://www.jooq.org/doc/3.14/manual/sql-building/table-expressions/values/

  • 我有一个简单的Maven项目,看起来像这个项目视图 有一个主要的pom。xml如下所示: 有两个模块-核心和测试。核心模块pom.xml: 测试模块pom。xml 我想使用核心内部测试的代码。这种依赖性看起来是正确的。该项目已生成,没有错误: 但是,当我在测试中尝试从core导入一个类时,找不到该类。

  • 我正面临着一个问题,也需要同样的帮助。它与GCP数据流(Apache Beam)有关。 我正在寻找使用项目a中定义的服务帐户()从其他项目a运行项目B的Dataflow模板的解决方案。已在项目B中具有必要的权限。 我已经尝试使用下面的命令 其中使用的是项目B中存在的模板的位置。 当我使用project A的服务帐户时,它会在project A中触发作业,但不会在project B中触发作业。当我使

  • 当我使用jersey开发一个rest api应用程序时,我遇到了一个问题,我需要为特定的业务逻辑部分实现一个websocketendpoint。 我提出这个问题是因为我认为jersey与javaee-api工件之间存在一些依赖关系冲突。