仅当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
组件具有空值或空值时(不要进一步挖掘以获得更好的方法,因为无论如何)。
答案 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。