1

私が開発しているアプリの要件では、検索を実行するときに、ユーザーは州を入力せずに都市を検索できないようにする必要があります。逆に、都市を入力せずに州を検索することはできません。

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

コードを簡略化して、標準のクロスフィールド検証方法で何を試みたかを示しました。しかし、私が直面している問題は、検証フェーズで、市と州の両方が検証エラーを示していることです。2つのバリデーターがお互いに邪魔をして、失敗のループを作成しているためだと思います。

これを回避するために使用できる回避策はありますか?

ありがとう。

4

1 に答える 1

1

コンポーネントは、コンポーネント ツリーで宣言されている順序で検証されます。

UIInput#getValue()まだ検証されていないコンポーネントを呼び出すと、 が返されますnullUIInput#getValue()また、すでに検証済みで無効とマークされているコンポーネントを呼び出すと、 null(または古いモデル値) が返されます。

最初のコンポーネントの検証中に 2 番目のコンポーネントの値を取得する場合は、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" />
于 2012-07-17T15:18:55.593 に答える