目标无法到达,标识符 'flowScope' 解析为空
Target Unreachable, identifier 'flowScope' resolved to null
我正在探索 JSF 2.2 中的 Faces Flow 功能,当我 运行 此页面中的教程时,我收到以下错误 Target Unreachable, identifier 'flowScope' resolved to null
:http://www.mastertheboss.com/javaee/jsf/faces-flow-tutorial
样本看起来很简单,它只有一个流和 3 个面,结构如下:
流称为 signup
,因此我的 WebContent
文件夹中有一个名为 signup
的文件夹,以及 3 个小面,其中一个与流同名作为起始节点,以及一个名为 signup-flow.xml
.
的配置文件
这是起始节点(signiup.xhtml
)的内容:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:ui="http://xmlns.jcp.org/jsf/facelets" xmlns:f="http://xmlns.jcp.org/jsf/core" xmlns:h="http://xmlns.jcp.org/jsf/html">
<h:head>
<title>Signup account</title>
<meta http-equiv="Content-Type"
content="application/xhtml+xml; charset=UTF-8" />
</h:head>
<h:body>
<h:form id="form1" styleClass="form">
<h1>Signup Account</h1>
<p>Name <h:inputText id="name" value="#{flowScope.name}" /></p>
<p>Surname: <h:inputText id="surname" value="#{flowScope.surname}" /></p>
<p>Email: <h:inputText id="email" value="#{flowScope.email}" /></p>
<p><h:commandButton id="page2" value="next" action="signup2" /></p>
</h:form>
</h:body>
</html>
这是我的 SignupBean
:
package com.jsf.flow;
import java.io.Serializable;
import javax.inject.Named;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.faces.flow.FlowScoped;
@Named
@FlowScoped(value="signup")
public class SignupBean implements Serializable {
private static final long serialVersionUID = 8112971305468080981L;
private boolean licenseAccepted;
public SignupBean() {
}
public String getHomeAction() {
return "/index";
}
public boolean isLicenseAccepted() {
return licenseAccepted;
}
public void setLicenseAccepted(boolean licenseAccepted) {
this.licenseAccepted = licenseAccepted;
}
public String accept() {
if (this.licenseAccepted) {
return "signup3";
} else {
FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "You have to read and accept the license!", "You have to read and accept the license!"));
return null;
}
}
}
这是我的 signup-flow.xml
:
<?xml version='1.0' encoding='UTF-8'?>
<faces-config
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-facesconfig_2_2.xsd"
version="2.2">
<flow-definition id="signup">
<flow-return id="homePage">
<from-outcome>#{signupBean.homeAction}</from-outcome>
</flow-return>
</flow-definition>
</faces-config>
点击signup.xhtml
里面的commandButton
就报错了,代码好像和教程里的一模一样,我查了好几个帖子都是一样的错误但似乎没有什么适合我。
这是堆栈跟踪中的重要部分:
javax.el.PropertyNotFoundException: /signup/signup.xhtml @12,68 value="#{flowScope.name}": Target Unreachable, identifier 'flowScope' resolved to null
at com.sun.faces.facelets.el.TagValueExpression.getType(TagValueExpression.java:100)
at com.sun.faces.renderkit.html_basic.HtmlBasicInputRenderer.getConvertedValue(HtmlBasicInputRenderer.java:95)
值得一提的是,我使用的是 GlassFish 4。
发现问题,我尝试使用 link 启动调用初始节点的流程,如下所示:
<h:link id="link1" styleClass="link" value="Link" outcome="/signup/signup.xhtml"></h:link>
相反,我将 link 替换为 commandButton
,并且在 action
参数中我使用了流程名称,如下所示:
<h:commandButton id="start" value="Signup User" action="signup"/>
现在可以使用了。
我正在探索 JSF 2.2 中的 Faces Flow 功能,当我 运行 此页面中的教程时,我收到以下错误 Target Unreachable, identifier 'flowScope' resolved to null
:http://www.mastertheboss.com/javaee/jsf/faces-flow-tutorial
样本看起来很简单,它只有一个流和 3 个面,结构如下:
流称为 signup
,因此我的 WebContent
文件夹中有一个名为 signup
的文件夹,以及 3 个小面,其中一个与流同名作为起始节点,以及一个名为 signup-flow.xml
.
这是起始节点(signiup.xhtml
)的内容:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:ui="http://xmlns.jcp.org/jsf/facelets" xmlns:f="http://xmlns.jcp.org/jsf/core" xmlns:h="http://xmlns.jcp.org/jsf/html">
<h:head>
<title>Signup account</title>
<meta http-equiv="Content-Type"
content="application/xhtml+xml; charset=UTF-8" />
</h:head>
<h:body>
<h:form id="form1" styleClass="form">
<h1>Signup Account</h1>
<p>Name <h:inputText id="name" value="#{flowScope.name}" /></p>
<p>Surname: <h:inputText id="surname" value="#{flowScope.surname}" /></p>
<p>Email: <h:inputText id="email" value="#{flowScope.email}" /></p>
<p><h:commandButton id="page2" value="next" action="signup2" /></p>
</h:form>
</h:body>
</html>
这是我的 SignupBean
:
package com.jsf.flow;
import java.io.Serializable;
import javax.inject.Named;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.faces.flow.FlowScoped;
@Named
@FlowScoped(value="signup")
public class SignupBean implements Serializable {
private static final long serialVersionUID = 8112971305468080981L;
private boolean licenseAccepted;
public SignupBean() {
}
public String getHomeAction() {
return "/index";
}
public boolean isLicenseAccepted() {
return licenseAccepted;
}
public void setLicenseAccepted(boolean licenseAccepted) {
this.licenseAccepted = licenseAccepted;
}
public String accept() {
if (this.licenseAccepted) {
return "signup3";
} else {
FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "You have to read and accept the license!", "You have to read and accept the license!"));
return null;
}
}
}
这是我的 signup-flow.xml
:
<?xml version='1.0' encoding='UTF-8'?>
<faces-config
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-facesconfig_2_2.xsd"
version="2.2">
<flow-definition id="signup">
<flow-return id="homePage">
<from-outcome>#{signupBean.homeAction}</from-outcome>
</flow-return>
</flow-definition>
</faces-config>
点击signup.xhtml
里面的commandButton
就报错了,代码好像和教程里的一模一样,我查了好几个帖子都是一样的错误但似乎没有什么适合我。
这是堆栈跟踪中的重要部分:
javax.el.PropertyNotFoundException: /signup/signup.xhtml @12,68 value="#{flowScope.name}": Target Unreachable, identifier 'flowScope' resolved to null
at com.sun.faces.facelets.el.TagValueExpression.getType(TagValueExpression.java:100)
at com.sun.faces.renderkit.html_basic.HtmlBasicInputRenderer.getConvertedValue(HtmlBasicInputRenderer.java:95)
值得一提的是,我使用的是 GlassFish 4。
发现问题,我尝试使用 link 启动调用初始节点的流程,如下所示:
<h:link id="link1" styleClass="link" value="Link" outcome="/signup/signup.xhtml"></h:link>
相反,我将 link 替换为 commandButton
,并且在 action
参数中我使用了流程名称,如下所示:
<h:commandButton id="start" value="Signup User" action="signup"/>
现在可以使用了。