0

同時に 2 つの入力の検証に問題があります。

私のバリデーターでは、両方からのデータが必要です:

  1. <h:selectOneListbox>
  2. <h:inputText>

アイデアは、配達担当者が住所に到達できるかどうかを確認することです。検証中にDBにリクエストを行います。そして、streetName + houseNumber の組み合わせを探します。

これは私の JSF ページの一部です。

    <h:form>
        <p> 
            <h:outputLabel for="streetsList" value="Street"/>
            <h:selectOneListbox id="streetsList" binding="#{theStreetsList}" 
                                size="1" value="#{makeOrder.streetName}" required="true">
                <f:selectItems value="#{locationView.streetNames}" var="streetName" 
                               itemLabel="#{streetName}" itemValue="#{streetName}"/>
            </h:selectOneListbox>
        </p>

        <p class="address_details">
            <h:outputLabel for="houseInput" value="#{msgs.house}"/>
            <h:inputText id="houseInput" class="tab_input house_input" 
                         value="#{makeOrder.house}" required="true">
                <f:validator validatorId="AddressValidator" />
                <f:attribute name="street" value="#{theStreetsList}" />
                <f:ajax event="blur" execute="streetsList houseInput" render="m_houseInput" />
            </h:inputText>
            <h:message id="m_houseInput" for="houseInput" style="color:red" />

            <h:outputLabel for="flatInput" class="flat_label" value="#{msgs.flat}"/>
            <h:inputText class="tab_input flat_input" value="#{makeOrder.flat}"/>
        </p>
    </h:form>

これが私のクラスのvalidateメソッドです:

@Override
public void validate(FacesContext context, UIComponent component, Object value) 
        throws ValidatorException {

    String house = (String) value;

    UIInput streetsComponent = (UIInput) component.getAttributes().get("street");
    String streetName = (String) streetsComponent.getSubmittedValue();

    Street orderStreet = this.findStreetInDB(streetName, house);

    if (orderStreet.getName().equals("dummyStreet")) {

        // Show error
        FacesMessage msg = new FacesMessage(
                "Unfortunately we do not deliver to this address, yet.");
        msg.setSeverity(FacesMessage.SEVERITY_ERROR);
        throw new ValidatorException(msg);
    }
}

私の問題はそれString streetNameですnull

PSこの要素の値は適切にレンダリングされます。また、検証を使用しない場合でも、フォームを送信できます。

  • 私は何を間違っていますか?
  • これを行う正しい方法は何ですか?

ありがとう!

4

1 に答える 1

1

送信された値を表す文字列 streetName は現在 null です。

コンポーネントは、コンポーネント ツリーに表示される順序で処理されます。処理中に、送信された値が取得、変換、および検証されます。何かが成功した場合、変換/検証された値がコンポーネントの値として設定され、送信された値が に設定されnullます。

2 つのコンポーネントのバリデーターの場合、別のコンポーネントの送信された値の取得は、バリデーターが最初のコンポーネントで呼び出された場合にのみ機能します。しかし、あなたの場合、それは 2 番目のコンポーネントで呼び出され、UIInput#getValue()代わりにを使用する必要がありますgetSubmittedValue()。これは、変換され検証された値を返すため、送信された「生の」値ではないことに注意してください。

于 2013-02-27T16:06:15.647 に答える