0

自本周初以来,我一直在使用 JSF 2.2(MyFaces implementation v2.2.6 和 Weld v2.2.7.Final for CDI),我面临以下问题:我无法与我的兄弟直接访问流入口点.

例如 :

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

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

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

我究竟做错了什么 ?不应该吗?我希望它应该!

当我在流程之外创建一个页面时,我没有任何问题,只有一个 commandButton 重定向到流程入口点。当我查看源代码时,似乎已经创建了流的 ID,尽管尚未访问流。这让我觉得 FlowScoped 的设计很糟糕。此外,这样的解决方法(“启动器”页面)破坏了我自己的设计和最终用户体验。

有哪些可用的解决方案?

这是一些示例代码:

创建.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>

创建控制器

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“启动器”

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

create-flow.xml 只包含一个“flow-return”指令。

4

1 回答 1

0

该异常表明您已导航到该页面,但您不在流程中。您应该检查链接是否真的进入流程,但在此之前,请检查是否启用了客户端窗口 api (javax.faces.CLIENT_WINDOW_MODE),因为面孔流程依赖于此功能。MyFaces 2.2 Faces Flow 实现工作得非常好,即使是 Mojarra 的实现无法处理的嵌套流等复杂情况,并且符合规范。

来自 Michael Kurz 博客的 JSF 2.2 实时系列中,有一些关于 JSF 2.2 特性的好例子。这些示例适用于 JSF 实现,MyFaces 和 Mojarra。查看Github jsflive上的 Faces Flow 示例。

于 2014-12-13T06:14:21.923 回答