Можно ли динамически использовать шаблоны Freemarker из нескольких проектов взаимозаменяемо? - PullRequest
0 голосов
/ 09 апреля 2019

У меня 2 проекта. Project A - это приложение Spring Boot, основное внимание уделяемое редактированию и обновлению информации. Проект B имеет средства для просмотра информации, и я пытаюсь использовать это как зависимость для ( A ), чтобы максимизировать повторное использование кода и минимизировать усилия по исправлению любых ошибок / созданию любых улучшения несколько раз.

Я надеюсь, что мои контроллеры и шаблоны смогут правильно находить нужные шаблоны динамически.

В проекте A правильно используются любые службы / daos и т. Д., Размещенные в зависимости Project B , но у меня возникают проблемы с тем, чтобы интерфейсная часть играла хорошо. В прошлом у меня был один проект без собственного интерфейса, использующий шаблоны, определенные во втором проекте. Это было так же просто, как установить правильный TemplateLoaderPath для Freemarker @Bean в моей конфигурации. На этот раз у меня есть подозрение, что как только я вызову шаблон, локальный для Project A , он будет предполагать, что любые последующие шаблоны также должны быть найдены по этому контекстному пути, а не заглядывать в Project B

Возможно, мне будет легче отобразить структуру проекта:

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

Я надеялся, что когда я верну новые объекты 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, как вы можете видеть, я применил setPreferFileSystemAccess к false (как было предложено здесь ), но безрезультатно.

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

Возможно, я слишком много спрашиваю о Freemarker, и это на самом деле невозможно. Но если нет, мне нужна помощь в правильной настройке моего проекта / freemarker для динамической работы с обоими источниками шаблонов. Я чувствую, что, возможно, упускаю что-то очевидное в отношении загрузки шаблона.

1 Ответ

1 голос
/ 12 апреля 2019

Благодаря @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, который немного отличается междуприложения.

...