3

我有一个关于带有 JSF 的 Spring Web Flow 的问题:如何教 Spring Web Flow 能够从 tomcat webapp 的类路径中的 jar加载相对视图,如view="pages/view.xhtml" ?经过谷歌的一些研究,我认为 Web Flow 不支持开箱即用的这个星座。

也许一些上下文,以帮助理解我的问题: - 流在多个 FlowRegistries 中注册(我通过实现自定义实现解决了这个问题,它在 Spring 上下文中找到所有 flowRegistries) - 流可以作为文件资源驻留在类路径之外或内部类路径中的 jar,即文件资源流位于WEB-INF/conf中的某个位置,并且它们在 jar 文件中的相同位置。- 流定义中的视图相对于流定义文件进行寻址

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

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

第一个问题是,flowRegistry 是一个整体,如果不事先做某事就无法拆分。这个问题是通过自定义流注册表解决的。

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

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

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

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

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

但是这种解决方法不起作用,因为我的多个流注册表存在问题。

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

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

4

1 回答 1

2

经过几个小时尝试和调试我的应用程序以了解如何实现问题的目标后,我自己找到了一个略有不同的解决方案。

  1. 首先要改变的是从 Tomcat 6 升级到 Tomcat 7,因为 servlet API 规范发生了变化,这使我能够通过稍微修改来解决我的问题
  2. 我从视图状态中的相对引用切换到绝对寻址
  3. 我更改了 jar 文件的目录结构以适应较新的 servlet API:JSF 或 Spring Webflow 所需的所有文件资源都需要放在 META-INF/resources 中(请参阅ServletContext的 Javadoc 查找方法 getResource,它指定了什么我需要)

这三个步骤使我能够将 webflow 及其资源完全打包到 jar 文件中。

于 2012-03-15T20:22:01.350 回答