0

我有一个使用对话框框架创建的确认对话框。该对话框由命令链接打开,在 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");

最重要的是,如果我使用对话框框架但没有打开窗口,一切都很好。我像这样设置命令链接:

              <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。

4

2 回答 2

3

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

我想即使我使用的是 trinidad lib 而不是 ADF,我们两种情况的根本原因也是一样的。trinidad 库实际上是 ADF 的一个分支,因此它们共享大量代码。

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

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

<tr:commandButton ... returnListener="bean.listenerMethod" ... useWindow="true" />

当此按钮所在的对话框关闭时,停止调用 bean.listenerMethod。设置 useWindow="false" 会导致再次调用 bean.listenerMethod。

在升级之前,上述命令按钮在两种情况下都运行良好(useWindow="true"/"false")。

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

现在来看看我在分析这个问题时的发现。

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

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

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

我已经调试了 trinindad 1.0.10 的源代码,并跟踪到这个差异是由这个“错误”引起的。

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

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

我对 JSF 很陌生,但对我来说这看起来像一个错误。

就我而言,以某种方式解决这个问题对我来说压力很大,所以让我们看看我能用这个做些什么。

于 2011-11-22T20:03:02.270 回答
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 目录来完成的,因为在加载类时,该目录被称为第一个,即在加载 WEB-INF 之前\libs 放置 trinidad lib 的位置)。

于 2011-11-23T19:50:54.017 回答