我使用对话框框架创建了一个确认对话框。该对话框由命令链接打开,并且在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。
答案 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。)