如果当前UIInput组件具有null或空值,则禁用验证

时间:2014-06-18 11:45:53

标签: jsf primefaces jsf-2.2

仅当UIInput组件的值为UIInput或为空时,我才需要验证null组件所持有的值的长度。

如果值为<f:validateLength>或为空,则应跳过/绕过长度验证器null

我尝试了以下方法但没有成功。

<p:inputTextarea id="address" autoResize="false" value="#{testManagedBean.address}" maxlength="1000" minQueryLength="10" cols="35" rows="7">
    <f:validateLength minimum="5" maximum="1000" disabled="#{empty testManagedBean.address}"/>
</p:inputTextarea>

<p:message for="address" display="both" showSummary="false"/>
<p:commandButton value="Submit" actionListener="#{testManagedBean.action}"/>

豆子:

@ManagedBean
@ViewScoped
public final class TestManagedBean implements Serializable
{
    private String address;
    private static final long serialVersionUID = 1L;

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public void action() {
        System.out.println("action() called.");
    }
}

此字段 - “地址”实际上是可选的,但如果某些用户提供输入,则其长度应至少包含五个字符。


修改

我正在使用disabled="#{empty param['form:address']}"来禁用验证程序,当UIInput组件具有空值或空值时(不要进一步挖掘以获得更好的方法,因为无论如何)。

2 个答案:

答案 0 :(得分:2)

不需要OmniFaces:您可以创建自己的验证器。您必须创建一个实现javax.faces.validator.Validator接口的类,覆盖validate()方法,并在xhtml页面中调用它。另一种选择是:

<p:inputTextarea id="address" autoResize="false" value="#{testManagedBean.address}" maxlength="1000" minQueryLength="10" cols="35" rows="7">
  <f:validator validatorId="myValidator"/>
</p:inputTextarea>

验证员类:

@FacesValidator("myValidator")
public class MyValidator Validator{

  @Override
  public void validate(FacesContext context, UIComponent component, Object value) 
        throws ValidatorException {
    String myValue = value.toString();
    if(myValue != null && !myValue.isEmpty() && (myValue.length() <= 5 || myValue.length() >= 1000)){
      throw new ValidatorException(new FacesMessage(FacesMessage.SEVERITY_ERROR,
          "MyValidator Error: ", 
          "This error appears if your input has less than 5 chars or more than 1000."));
    }
  }
}

答案 1 :(得分:1)

您已走上正轨,但您并没有正确地从组件中提取价值。

将组件绑定到页面范围并检索值,如下所示:

<p:inputTextarea id="address" binding="#{theAddress}" autoResize="false" value="#{testManagedBean.address}" maxlength="1000" minQueryLength="10" cols="35" rows="7">
    <f:validateLength minimum="5" maximum="1000" disabled="#{empty theAddress.getSubmittedValue()}"/>
</p:inputTextarea>

您当前的方法需要将textArea的值写入辅助bean。在验证发生之前不会发生这种情况(请记住:成功验证后,testManagedBean.address仅可用);您在验证期间期待相同的值:catch 22。