JSF2跨域验证失败循环

时间:2012-07-17 13:28:27

标签: validation java-ee jsf-2

我正在开发的应用程序中的要求说,在执行搜索时,用户不应该在没有进入状态的情况下搜索城市,反之亦然,他们不应该在不进入城市的情况下搜索状态。

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."));
        }
    }
}

我简化了我的代码,以显示我尝试使用标准交叉字段验证方法。但是,我遇到的问题是,在验证阶段,城市和州都显示验证错误,我猜是因为两个验证器正在相互接触,因此会产生一个失败循环。

我可以使用解决方法来解决这个问题吗?

感谢。

1 个答案:

答案 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" />