可以从 Servlet 中启动人脸流吗?

Can a faces flow be started from within a Servlet?

我有一个由 servlet 访问的服务,它将用户重定向到登录屏幕。支持 bean 的范围目前正在从 @ConversationScoped 更改为 @FlowScoped,因为它更容易处理。

有没有一种方法可以直接从 servlet 中初始化面孔流,而无需通过隐式操作或 JSF 进行间接访问 forward/redirect?

我知道 @FlowScope 是一个 JSF (2.2) 范围,我想知道是否有办法,例如扩展 FacesServlet 或类似的东西。

作为一种解决方法,我目前只是添加了一个带有按钮的视图,这使得 JSF 前进以进入流目录,但我正在努力避免这种情况。

更新
我尝试了很多 'automatically' 转发到流中的方法,而无需单击任何按钮,但我总是得到 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 中的方法 returns 与 f:viewAction.

  3. 中的结果相同
  4. 航海案例

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

我错过了什么?

我终于找到了解决方案,在阅读规范并摆弄流程之后!
我有一个页面,其中只有:

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

到目前为止一切顺利,但技巧在于方法内部,您必须在其中 'manually' 通过执行以下操作来初始化所需的流程:

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方法'activates'命名流并使其可用,这样您就可以转发到流的入口点。
请注意,即使它看起来像一个普通的转发,viewAction 总是做一个重定向!