我们正在从JSF 1.2迁移到JSF2。 我们在验证方面面临问题。我们正在使用apache myfaces 2和rich faces 4.3 下面是xhtml代码:
<h:form id="form">
<ui:include src="panel1.xhtml"/>
<h:commandButton id="btn1" value="Submit" action="#{bean.submit}"/>
</h:form>
panel1.xhtml包含一个自定义组件,如下所示:
<h:panelGrid columns="2">
<h:outputText value="Enter Phone"/>
<h:inputText id="compId" value="#{map['Phone']}" size="12" maxlength="20" required="true"
validator="#{validator.validatePhone}"/>
<!-- other components omitted -->
</h:panelGrid>
public void validatePhone(FacesContext arg0, UIComponent arg1, Object obj)
throws ValidatorException {
String phoneVal = (String) obj;
if(phoneVal .length() <5){
//rest of the code is omitted
}
}
问题是,当未输入电话价值(保持为空)并提交表格时,以下是观察结果。
JSF 2: 使用Object obj值(在validatePhone方法中)调用validator.validatePhone为null
JSF 1.2: required =“true”属性首先生效,并且根本不调用validator.validatePhone(如果Phone字段中没有值)并且验证 显示错误。
问题是:
1)为什么为JSF 2调用validator.validatePhone,即使Phone字段中没有值? 2)为什么在上述情况下JSF 1.2和JSF 2中的行为发生了变化?
答案 0 :(得分:1)
不一致的原因是在JSF2中,null
值默认情况下不会失败验证。来自the Javadocs:
要使验证器完全符合规范的版本2及更高版本,它必须不会对null值或空值进行验证失败,除非它专门用于解决空值或空值
要支持JSF1.2的验证行为,请使用javax.faces.VALIDATE_EMPTY_FIELDS
上下文参数:
<context-param>
<param-name>javax.faces.VALIDATE_EMPTY_FIELDS</param-name>
<param-value>false</param-value>
</context-param>