我正在开发的应用程序中的要求说,在执行搜索时,用户不应该在没有进入状态的情况下搜索城市,反之亦然,他们不应该在不进入城市的情况下搜索状态。
search.xhtml
<h:inputText id="city" binding="#{city}" value="#{search.city}" validator="#{search.validateCity}">
<f:attribute name="state" value="#{state}"/>
</h:inputText>
<h:inputText id="state" binding="#{state}" value="#{search.state}" validator="#{search.validateState}">
<f:attribute name="city" value="#{city}"/>
</h:inputText>
Search.java
public void validateCity(FacesContext context, UIComponent component, Object convertedValue) {
UIInput stateComponent = (UIInput) component.getAttributes().get("state");
String state = (String) stateComponent.getValue();
if(convertedValue.toString().length() > 0) {
if(state.length() < 1) {
throw new ValidatorException(new FacesMessage("Please enter State."));
}
}
}
public void validateState(FacesContext context, UIComponent component, Object convertedValue) {
UIInput cityComponent = (UIInput) component.getAttributes().get("city");
String city = (String) cityComponent.getValue();
if(convertedValue.toString().length() > 0) {
if(city.length() < 1) {
throw new ValidatorException(new FacesMessage("Please enter City."));
}
}
}
我简化了我的代码,以显示我尝试使用标准交叉字段验证方法。但是,我遇到的问题是,在验证阶段,城市和州都显示验证错误,我猜是因为两个验证器正在相互接触,因此会产生一个失败循环。
我可以使用解决方法来解决这个问题吗?
感谢。
答案 0 :(得分:1)
组件在组件树中声明时按顺序进行验证。
当您在尚未验证的组件上调用UIInput#getValue()
时,它将返回null
。此外,当您对已经过验证且标记为无效的组件调用UIInput#getValue()
时,它将返回null
(或旧模型值)。
如果您想在验证第一个组件期间获取第二个组件的值,那么您应该使用UIInput#getSubmittedValue()
而不是UIInput#getValue()
。您应该记住,这会返回未转换的String
。
或者,您可以查看OmniFaces <o:validateAllOrNone>
组件。
<h:inputText id="city" value="#{search.city}" />
<h:inputText id="state" value="#{search.state}" />
<o:validateAllOrNone id="cityAndState" components="city state" message="Please fill both city and state." />
<h:message for="cityAndState" />