2

ユーザーをログイン画面にリダイレクトするサーブレットによってアクセスされるサービスがあります。バッキング Bean のスコープは現在、@ConversationScoped から @FlowScoped に変更されています。これは、処理が容易になるためです。

暗黙のアクションや JSF フォワード/リダイレクトによる間接化なしに、サーブレット内から直接 Faces フローを初期化する方法はありますか?

@FlowScope が JSF (2.2) スコープであることは承知しており、たとえば FacesServlet などを拡張する方法があるかどうか疑問に思っていました。

回避策として、現在、ボタン付きのビューを追加しました。これにより、JSF フォワードがフロー ディレクトリに入るようになりますが、これを回避しようとしています。

更新
ボタンをクリックしなくても、フローに「自動的に」転送する多くのアプローチを試しましたが、常にNo active contexts for scope type javax.faces.flow.FlowScoped. ここで私のアプローチ:

  1. f:viewAction

    <f:metadata>
      <f:viewAction action="myFlow" />
    </f:metadata>
    

    これは実行が早すぎるようです (いずれにせよ)。

  2. f:event

    <f:event type="preRenderView" listener="#{myBean.forwardToMyFlow()}" />
    

    Bean のメソッドは、 と同じ結果を返しますf:viewAction

  3. ナビケース

    <navigation-rule>
      <from-view-id>/myView.xhtml</from-view-id>
      <navigation-case>
        <from-outcome>myFlow</from-outcome>
        <to-view-id>/myFlow/myFlow.xhtml</to-view-id>
        <redirect />
        <to-flow-document-id />
      </navigation-case>
    </navigation-rule>
    

私は何が欠けていますか?

4

1 に答える 1

5

仕様を読んでフローをいじった後、ようやく解決策を見つけました!
私は単に持っているページを持っています:

<f:metadata>
    <f:viewAction action="#{bean.initFlow}" />
</f:metadata>

ここまではうまくいきましたが、トリックはメソッド内にあり、次のようにして目的のフローを「手動で」初期化する必要があります。

public String initFlow(){
   FacesContext context = FacesContext.getCurrentInstance();
   FlowHandler handler = context.getApplication().getFlowHandler();
   handler.transition(context, null, handler.getFlow(context, "", "flow-name"), null, "");
   return "flow-name";
}

このtransitionメソッドは、名前付きフローを「アクティブ化」して使用可能にするため、フローのエントリ ポイントに転送できます。通常の転送のように見えても、常にリダイレクトを行うことに
注意してください。viewAction

于 2015-03-25T14:59:45.003 に答える