【问题标题】:Overriding a JSF 2.0 navigation rule in a jar file覆盖 jar 文件中的 JSF 2.0 导航规则
【发布时间】: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 来收集导航案例。 SetList 之间的主要区别在于 Set 保证唯一性(即不允许重复元素)。
  • 是的 BalusC,您对 Set 的实现是正确的,我的措辞是错误的,问题是我对如何将这些 NavigationCase 插入 Set 没有任何保证,即使使用的集合是维护插入顺序的集合。 jar 文件中的 NavigationCase 根本不应该存在。

标签: jsf-2


【解决方案1】:

This 页面在第 9.2.4.3 段第二个 alinea 中明确指出:

如果发生冲突,其中两个或多个案例具有相同的 from-view-id、from-action 和 from-outcome 值,最后一种情况(如 它们在 faces-config.xml 中列出)被使用。如果冲突是 在不同配置文件中定义的规则中, 使用要加载的最后一个配置文件。配置文件是 按照它们在 web.xml 文件中出现的顺序加载。

并且this页面底部明确声明:

如果一个应用程序使用多个 JSF 配置文件,在运行时 JSF 在 以下顺序:

在任何 JAR 文件中搜索名为 META-INF/faces-config.xml 的文件 对于应用程序,并将每个作为配置资源加载(在 与它们被发现的顺序相反)。

搜索 javax.faces.CONFIG_FILES 上下文参数集 应用程序的 web.xml 文件。然后 JSF 将每个命名文件加载为 配置资源。

在 WEB-INF 目录中搜索名为 faces-config.xml 的文件 并将其作为配置资源加载。

所以这似乎是一个错误,或者您有一些不太正确的东西导致它无法在您的 WEB-INF/faces-config.xml 中加载规则。你那里有真正有用的导航箱吗?您可能还想检查您的日志。有时应用程序已成功部署,但会出现一些警告,表明某些事情被忽略或不太正确。

顺便说一句,一个 Set 可能没有定义一个顺序,但它不允许重复,所以应该只有一个匹配。即为键插入的最后一个值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-22
    • 1970-01-01
    • 2014-04-26
    • 1970-01-01
    • 2011-07-05
    相关资源
    最近更新 更多