WELD-001303对于直接访问的范围类型javax.faces.flow.FlowScoped没有活动的上下文

时间:2014-12-03 20:04:52

标签: jsf weld flow-scope

我从一周开始就玩JSF 2.2(MyFaces实施v2.2.6和Weld v2.2.7.Final for CDI),我面临以下问题:我无法直接访问和我哥哥一起进入流程。

例如:

我的网络应用包含一个名为'创建'它允许在数据库中创建记录。 我希望能够在浏览器地址栏中输入网址http://my.domain/webapp/create/create.jsf

当我这样做时,页面没有正确呈现,并且服务器中出现以下日志

  

日志:WELD-001303范围类型没有活动的上下文   javax.faces.flow.FlowScoped。

我做错了什么?难道不可能吗?我希望它应该!

当我在流程之外创建一个只有一个commandButton重定向到流入口点的页面时,我没有任何问题。 当我观察源代码时,似乎已经创建了流的id,尽管尚未访问流。 这让我觉得FlowScoped的设计很糟糕。 此外,这样的工作(发射器和页面)破坏了我自己的设计和最终用户体验。

有哪些可用的解决方案?

以下是一些示例代码:

create.xhtml

<h1>Create record</h1>
<h:form id="create-record" prependId="false">
    <label for="name">Name</label>
    <h:inputText id="name" value="#{createController.name}" />
    <h:commandButton title="Abandon" value="Abandon" id="abandon" action="returnFromCreate" immediate="true" />
    <h:commandButton title="Validate" value="Validate" id="validate" action="#{createController.create()}" />
</h:form>

CreateController

package my.company;

import java.io.Serializable;

import javax.faces.flow.FlowScoped;
import javax.inject.Inject;
import javax.inject.Named;

@Named
@FlowScoped("create")
public class CreateController implements Serializable {

    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String create() {
        // TODO
        return "returnFromCreate";
    }
}

xhtml&#34;启动器&#34;

<h:form>
    <h:commandButton action="create" value="Go" />
</h:form>

create-flow.xml只包含&#34; flow-return&#34;指令。

1 个答案:

答案 0 :(得分:0)

该异常表示您已导航到该页面,但您不在该流程内。您应该检查链接是否真正进入流程,但在此之前,检查客户端窗口api是否已启用(javax.faces.CLIENT_WINDOW_MODE),因为faces flow依赖于此功能。 MyFaces 2.2 Faces Flow实现非常有效,即使是像Mojarra实现的嵌套流这样的复杂情况也可以处理,并符合规范。

JSF 2.2 live series from Michael Kurz Blog中有一些关于JSF 2.2功能的好例子。这些示例适用于JSF实现,MyFaces和Mojarra。在Github jsflive上查看Faces Flow的示例。