2

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

有没有一种方法可以直接从 servlet 中初始化面流,而无需通过隐式操作或 JSF 转发/重定向进行间接初始化?

我知道@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 回答