假设以下内容:
在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应用程序中覆盖此导航规则,因此我将以下导航规则放在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 并且操作结果成功时,我认为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我不明白我怎么知道哪个faces-config.xml文件是NavigationCase来的
有任何想法或建议吗?
谢谢你们。
关于Eelke回答:
这是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是不同的,因此它们不相等。
答案 0 :(得分:1)
This页明确指出第9.2.4.3段第二个alinea:
如果存在两个或两个以上案件相同的冲突 from-view-id,from-action和from-outcome值,最后一种情况(as 它们列在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中加载规则。那里有导航案例吗?您也可以查看日志。有时候应用程序已成功部署,但有些事情被忽略或不太正确。
BTW a Set可能没有定义订单,但它不允许重复,所以应该只有一个匹配。即为密钥插入的最后一个值。