【发布时间】:2012-02-05 00:09:17
【问题描述】:
假设如下:
在 jar 文件中,您有一个 META-INF/faces-config.xml 文件,其中包含以下导航规则:
<navigation-rule>
<from-view-id>/path/page1.xhtml</from-view-id>
<navigation-case>
<from-outcome>success</from-outcome>
<to-view-id>/path/result.xhtml</to-view-id>
</navigation-case>
</navigation-rule>
我想在我的网络应用程序中覆盖这个导航规则,所以我将以下导航规则放在WEB-INF/faces-config.xml中,如下所示:
<navigation-rule>
<from-view-id>/path/page1.xhtml</from-view-id>
<navigation-case>
<from-outcome>success</from-outcome>
<to-view-id>/path/my_custom_result.xhtml</to-view-id>
</navigation-case>
</navigation-rule>
所以当我在页面 /path/page1.xhtml 并且操作结果是 success 我想 WEB-INF/faces-config 中的导航案例.xml 是结果(即 /path/my_custom_result.xhtml),但不幸的是结果是 jar META-INF/faces-config.xml 中的结果(即 /path/result.xhtml)。尽管查看代码,这两种情况都在 java.util.Set 中,所以甚至不能保证顺序!
第一个问题是你认为这是一个错误吗?虽然在 JSF 规范中没有提到这种情况,但我认为让本地 faces-config.xml 配置覆盖 jar 文件中的配置是很有意义的。
第二个问题是:我知道我可以创建一个自定义 NavigationHandler,但是查看 com.sun.faces.application.NavigationHandlerImpl 我不明白我如何知道 NavigationCase 来自哪个 faces-config.xml 文件.
有什么想法或建议吗?
谢谢大家。
关于鳗鱼的回答:
这是 ADF 文档,我正在寻找的是 JSF 2.0 规范,您可以在这里找到:http://download.oracle.com/otndocs/jcp/jsf-2.0-fr-eval-oth-JSpec/,在那里我找到了以下行
It is an error to specify more than one <navigation-case>,nested
within one or more <navigation-rule> elements with the same
<from-view-id>matching pattern, that have exactly the same combination
of <from-xxx>, unless each is discriminated by a unique <if> element.
这让我觉得我正在尝试做的事情是不可能的,尽管一些 JSF 实现在这种情况下可能会有稍微不同的行为(例如 ADF)。
关于重复项,NavigationCase.equals 方法检查所有属性是否相同,在我的情况下,toViewID 不同,因此它们不相等。
【问题讨论】:
-
“虽然查看代码,这两种情况都在 java.util.Set 中,所以甚至不能保证顺序!” 你的意思是
Set从不保证订单。你错了。控制它的是Set实现。例如HashSet确实不能保证顺序。TreeSet通过排序保证顺序。LinkedHashSet保证插入顺序。 JSF 实现使用LinkedHashSet来收集导航案例。Set和List之间的主要区别在于Set保证唯一性(即不允许重复元素)。 -
是的 BalusC,您对 Set 的实现是正确的,我的措辞是错误的,问题是我对如何将这些 NavigationCase 插入 Set 没有任何保证,即使使用的集合是维护插入顺序的集合。 jar 文件中的 NavigationCase 根本不应该存在。
标签: jsf-2