1

org.omnifaces.util.Faces#redirect と会話スコープ Bean に問題があります。

ボタンがあります

<p:commandButton action="#{navigationHandler.gotoCreateCar}"
  actionListener="#{createHandler.init(searchHandler.search())}
  value="#{msg.search}" update=":articleSearchForm">
  <f:param name="cid" value="#{javax.enterprise.context.conversation.id}"/>
</p:commandButton>

これは、会話スコープ Bean: createHandler の初期化後に、同じ会話スコープ内で createCar ページへのナビゲーションを実行する必要があります。

NavigationHandler#gotoCreateCar では、Faces.redirect(createCarPage) を呼び出すだけです。

このようにすると、パラメーター cid が転送されず、会話が失われます。

faces-config.xml でナビゲーション ルールを定義すると、次のようになります。

<navigation-case>
  <from-outcome>createCar</from-outcome>
  <to-view-id>/portal/createCar.xhtml</to-view-id>
  <redirect />
</navigation-case>

NavigationHandler#gotoCreateCar では、必要な結果を返すだけで、正常に動作します。

この 2 つのナビゲーション アプローチの違いの詳細をすべて理解していない可能性があります。誰かが問題を理解するのを手伝ってくれれば幸いです。

ありがとう!

4

1 に答える 1

3

会話の伝播は、ナビゲーション ハンドラーによって処理されます。ナビゲーション ハンドラーを使用しないFaces#redirect()デリゲート。代わりに which delegates to をExternalContext#redirect()使用することをお勧めします。Faces#navigate()NavigationHandler#handleNavigation()

public void gotoCreateCar() {
    // ...

    Faces.navigate("/portal/createCar.xhtml?faces-redirect=true");
}

(注:<navigation-case>この場合は必要ありません)

または、アクション メソッドからその文字列を正確に返すだけです。

public String gotoCreateCar() {
    // ...

    return "/portal/createCar.xhtml?faces-redirect=true";
}    

は、またはFaces#navigate()などのナビゲーション ケースの結果を返すことをサポートしていない (リスナー) メソッド内にいる場合にのみ役立ちます。@PostConstructpreRenderView

于 2014-06-17T08:52:19.033 に答える