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"/>

すべてが正しく機能します。jDev10.3.1.4と同じバージョンのADFを使用しています。

4

2 に答える 2

3

私は非常によく似た質問を書いているところですが、あなたがすでに投稿していることに気付きました。

ADF ではなく trinidad lib を使用している場合でも、根本的な原因は両方のケースで同じになると思います。trinidad lib は、実際には ADF からのフォークであったため、かなり多くのコードを共有しています。

私の場合、trinidad 1.0.7 から trinidad 1.0.10 に移行しました (この問題のため)。

このアップグレードにより、次のように定義された 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 で呼び出されます)。

私は trinndad 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

このクラスに、トリニダードライブラリの対応するクラスからすべてをコピーしました。次に、 https://issues.apache.org/jira/browse/TRINIDAD-1193で修正のために行われた変更をコメントアウトしました。

最後に、クラスがtrinidad libからのクラスの前に最初にロードされることを確認します(tomcatでは、クラスをロードするとき、つまりWEB-INFをロードする前に、このディレクトリが最初のディレクトリとして呼び出されるため、これはクラスをWEB_INF \classesdirにコピーすることによって行われました。トリニダードライブラリが配置されている\libs)。

于 2011-11-23T19:50:54.017 に答える