自本周初以来,我一直在使用 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”指令。