У меня 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 для динамической работы с обоими источниками шаблонов. Я чувствую, что, возможно, упускаю что-то очевидное в отношении загрузки шаблона.