从jar文件加载的流中的视图状态中的相对视图

时间:2012-03-08 13:36:06

标签: java spring jsf spring-webflow-2

我对使用JSF的Spring Web Flow有一个疑问:我如何教Spring Web Flow能够从jar中加载相对视图,如 view =“pages / view.xhtml” tomcat webapp的classpath?经过谷歌的一些研究后,我认为,Web Flow并不支持这个开箱即用的星座。

也许有些背景,以帮助理解我的问题:   - 流程在多个FlowRegistries中注册(我通过实现自定义实现解决了这个问题,该实现在Spring上下文中查找所有flowRegistries)   - 流可以作为类路径外的文件资源驻留,也可以作为类路径中的jar驻留,即文件资源流位于 WEB-INF / conf 中的某个位置,它们位于jar文件中的相同位置。   - 流定义中的视图相对于flow-definition-file

进行了处理

现在你可能会问这个问题为什么我们有两个星座,流可以驻留在哪里。目前,我们正在尝试从包含属于某个域的所有功能的大量webapp模块中提取。方法是将所有相关的工件捆绑在一个项目中,该项目可以构建为jar并添加到webapp中。

虽然在不知道配置文件所在位置的情况下为每个jar加载Spring bean没有问题,但Web Flow会导致一些问题。

第一个问题是,flowRegistry是一个整体,如果不事先做一些事情就无法拆分。自定义流注册表解决了此问题。

但现在我遇到了第二个问题:在视图状态中,我们相对于流定义引用了页面,如documentation中所述:

<view-state id="some-id" view="pages/somepage.xhtml"> ... </view-state>

现在,当我进入这样的视图状态时,web流会抛出一个异常,告诉我这种方式不受支持:

A ContextResource is required to get relative view paths within this context;
the resource was ...

谷歌搜索提出了这个可能的解决方案: workaround for webflows in jars

但是这种解决方法无效,因为我的多流注册表存在问题。

另一个选择可能是不把所有东西放进罐子里,但我不确定这是不是更好的主意。可能拥有可以从jar中的classpath加载的所有东西,其余的作为定义结构中的纯文件。

有什么想法吗?非常感谢您的努力和提示。

1 个答案:

答案 0 :(得分:2)

在尝试和调试我的应用程序如何完成问题的目标后,我发现了一个略有不同的解决方案。

  1. 要改变的第一件事是从Tomcat 6升级到Tomcat 7,因为servlet API规范发生了变化,这使我能够通过稍加修改解决我的问题
  2. 我从视图状态中的相对引用切换到绝对寻址
  3. 我更改了jar文件的目录结构以适应更新的servlet API:JSF或Spring Webflow所需的所有文件资源都需要放在META-INF / resources中(参见Javadoc of ServletContext查找方法getResource,它指定我需要的东西)
  4. 这三个步骤使我能够将jarflow及其资源完全打包在jar文件中。