0

我在同时验证两个输入时遇到问题。

在我的验证器中,我需要来自两者的数据:

  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>

这是我班级的验证方法:

@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 streetNamenull

该元素的PS值渲染得很好。如果我不使用验证,我什至可以提交表单。

  • 我究竟做错了什么?
  • 这样做的正确方法是什么?

谢谢!

4

1 回答 1

1

表示提交值的 String streetName 现在为空。

组件按照它们在组件树中出现的顺序进行处理。在处理过程中,获取、转换和验证提交的值。如果任何事情都成功,则转换/验证的值设置为组件的值,提交的值设置为null.

对于 2 个组件上的验证器,只有在第一个组件上调用验证器时,才能获取另一个组件的提交值。但是在您的情况下,它是在第二个组件上调用的,您应该使用UIInput#getValue()而不是getSubmittedValue(). 请注意,这将返回转换和验证的值,因此不是“原始”提交的值。

于 2013-02-27T16:06:15.647 回答