从Dialog中在returnListener中设置导航规则在ADF 10g中不起作用(JSF面1.1)

时间:2011-11-04 09:21:06

标签: java jsf dialog oracle-adf

我使用对话框框架创建了一个确认对话框。该对话框由命令链接打开,并且在tg中选择的值将返回到返回侦听器。这是我的命令链接。

              <af:commandLink id="btnSalva" shortDesc="Salva" 
                              binding="#{segnaPrzzDep.btnSalva}"
                              partialSubmit="true" immediate="true"
                              windowHeight="250"
                              windowWidth="350"
                              useWindow="true"
                              action="#{segnaPrzzDep.aclSalvaSegnaPrezzoDep}"
                              returnListener="#{segnaPrzzDep.rtlSalvaSegnaPrezzoDep}"
                              styleClass="btnSalva"/>

在返回侦听器中,我尝试设置导航规则,但没有任何反应。我这样做(返回处理程序只做这个):

    FacesContext fc = FacesContext.getCurrentInstance();
    NavigationHandler nh =  fc.getApplication().getNavigationHandler();
    nh.handleNavigation(fc, "", "archivio");

starnge的事情是,如果我使用对话框架但没有打开窗口一切都可以。我设置了这样的命令链接:

              <af:commandLink id="btnSalva" shortDesc="Salva" 
                              binding="#{segnaPrzzDep.btnSalva}"
                              partialSubmit="true" immediate="true"
                              action="#{segnaPrzzDep.aclSalvaSegnaPrezzoDep}"
                              returnListener="#{segnaPrzzDep.rtlSalvaSegnaPrezzoDep}"
                              styleClass="btnSalva"/>

一切正常。我正在使用jDev 10.3.1.4和相同版本的ADF。

2 个答案:

答案 0 :(得分:3)

我刚刚写了一个非常相似的问题,然后我注意到你已经发布了它。

我想在我们的两个案例中根本原因都是一样的,即使我使用的是trinidad lib而不是ADF。特立尼达lib实际上是来自ADF的一个分支,所以它们分享了很多代码。

就我而言,我们已经从trinidad 1.0.7迁移到trinidad 1.0.10(由于this问题)。

由于此次升级,我们的jsp文件中的“commandButton”标记定义为

<tr:commandButton ... returnListener="bean.listenerMethod" ... useWindow="true" />
当关闭此按钮的对话框时,

停止调用bean.listenerMethod。 设置useWindow =“false”会导致再次调用bean.listenerMethod。

在升级之前,提到的commandButton在两种情况下都运行良好(useWindow =“true”/“false”)。

所以你可以看到症状非常相似。

现在我在分析这个问题时所做的调查结果。

通过检查日志,我发现LifeCycleImpl类在返回主页面时没有调用所有阶段(关闭对话框后)。

所以1)处理对话框上的帖子,这意味着处理了所有阶段,2)之后调用了主页面,但这次刚刚处理了第一阶段“恢复视图”,然后直接跳转到“渲染响应“阶段调用主页而不调用bean.listenerMethod。

检查trinidad 1.0.7上的相同日志时,在步骤2中也调用了所有阶段。

我已经调试了trinindad 1.0.10的来源并跟踪了这个差异是由this“bug”引起的。

这里的问题是UIViewRoot正在从会话中删除。当然后在对话框上调用close时,在(如上所述)步骤2)期间的“恢复视图”阶段找不到主页面的UIVIewRoot。

当发生这种情况时,LifeCycleImpl决定直接跳到“渲染阶段”,因为它可能期望由于在会话中缺少UIViewRoot,这是对页面(视图)的第一次调用,因此它只是重新加载主页面

我对JSF很新,但对我来说这看起来像个bug。

在我的情况下,我以某种方式解决这个问题的压力很大,所以让我们看看我能用这个做什么。

答案 1 :(得分:2)

我已向https://issues.apache.org/jira/browse/TRINIDAD-2171发布了一个新错误。

我找到了解决此问题的方法。在我的项目中,我创建了一个类和一个包 为org/apache/myfaces/trinidadinternal/application/StateManagerImpl.java

对于这个类,我已经复制了trinidad lib中相应类的所有内容。然后我 已注释掉由于https://issues.apache.org/jira/browse/TRINIDAD-1193中的修复所做的更改。

最后我确保我的类首先在trinidad lib之前加载(在tomcat中这是通过将类复制到WEB_INF \ classes目录来完成的,因为这个目录在加载类时被称为第一个,即在加载之前放置trinidad lib的WEB-INF \ libs。)