Относительные представления в состояниях представления в потоке, который загружен из jar-файла
У меня есть вопрос, касающийся Spring Web Flow с JSF: как я могу научить Spring Web Flow загружать относительные представления, например view="pages/view.xhtml", из jar- файла в classpath веб- приложения tomcat? После некоторого исследования через Google я думаю, что Web Flow не поддерживает это созвездие из коробки.
Может быть, некоторый контекст, чтобы помочь понять мой вопрос: - Потоки зарегистрированы в нескольких FlowRegistries (я решил эту проблему с помощью реализации пользовательской реализации, которая находит все flowRegistries в контексте Spring) - Потоки могут находиться либо как файловый ресурс вне classpath, либо внутри jar в пути к классам, то есть потоки ресурсов файлов находятся где-то в WEB-INF/conf, и они находятся в одной и той же позиции в файлах jar. - Представления в определениях потока адресованы относительно файла определения потока
Теперь вы можете задать вопрос, почему у нас есть оба созвездия, где могут находиться потоки. В данный момент мы пытаемся извлечь из большого количества модулей веб-приложения, которые содержат все функции, принадлежащие определенному домену. Подход заключается в объединении всех относящихся к нему артефактов в рамках одного проекта, который затем можно создать как jar и затем добавить в веб-приложение.
Несмотря на то, что нет проблем с загрузкой bean-компонентов Spring для каждой банки, не зная, где находятся наши файлы конфигурации, Web-поток вызывает некоторые проблемы.
Первая проблема заключалась в том, что flowRegistry - это монолит, который нельзя разделить, не сделав что-либо перед этим. Эта проблема решается с помощью пользовательского потока реестра.
Но теперь я подошел ко второй проблеме: в состояниях просмотра мы ссылаемся на страницы относительно определения потока, как описано в документации:
<view-state id="some-id" view="pages/somepage.xhtml"> ... </view-state>
Теперь, когда я вхожу в такое состояние просмотра, веб-поток выдает исключение, которое говорит мне, что этот способ не поддерживается:
A ContextResource is required to get relative view paths within this context;
the resource was ...
Поискивая в поисках этого возможного решения: обходной путь для веб-потоков в банках
Но этот обходной путь не работает, поскольку у него есть проблема с несколькими регистрами потоков.
Другим вариантом может быть не положить все в банку, но я не уверен, что это лучшая идея. Скорее всего, есть все, что может быть загружено из classpath в банке, а остальные как чистые файлы в определенной структуре.
Есть идеи? Большое спасибо за ваши усилия и советы.
1 ответ
Я сам нашел несколько иное решение после нескольких часов попыток и отладки моего приложения о том, как достичь цели вопроса.
- Первым делом нужно было перейти с Tomcat 6 на Tomcat 7 из-за изменения спецификации API сервлета, что позволило мне решить мою проблему с небольшими изменениями.
- Я переключился с относительных ссылок в состояниях представления на абсолютную адресацию
- Я изменил структуру каталогов моего jar-файла, чтобы он соответствовал новому API сервлета: все файловые ресурсы, необходимые для JSF или Spring Webflow, должны быть размещены в META-INF/resources (см. Javadoc из ServletContext, ищите метод getResource, он определяет, что Мне было нужно)
Эти три шага позволили мне полностью упаковать веб-потоки и их ресурсы в jar-файлы.