我有三个单选按钮,一个inputText和一个提交按钮。我只想在选择某个收音机时验证提交时的输入文本。所以我有
<h:inputText validator="#{myBean.validateNumber}" ... />
在我的豆里,我有
public void validateNumber(FacesContext context, UIComponent component,
Object value) throws ValidatorException{
if(selectedRadio.equals("Some Value"){
validate(selectedText);
}
}
public void validate(String number){
if (number != null && !number.isEmpty()) {
try {
Integer.parseInt(number);
} catch (NumberFormatException ex) {
throw new ValidatorException(new FacesMessage(FacesMessage.SEVERITY_ERROR,
"Error", "Not a number."));
}
} else {
throw new ValidatorException(new FacesMessage(FacesMessage.SEVERITY_ERROR,
"Error", "Value is required."));
}
}
使这不起作用的一件事是,当我提交时,validateNumber(...)
在我的单选按钮setSelectedRadio(String selectedRadio)
的setter方法之前运行。因此导致此陈述
if(selectedRadio.equals("Some Value"){
validate(selectedText);
}
无法正确执行。如何解决这个问题?
答案 0 :(得分:3)
selectedRadio
是仅在更新模型值阶段更新的模型值,在验证阶段之后。这就是为什么当你试图检查它时它仍然是最初的模型值。
您必须从请求参数映射(原始提交的值)或UIInput
引用中获取它,以便您可以通过getSubmittedValue()
获取提交的值或转换/验证的值getValue()
。
所以,
String selectedRadio = externalContext.getRequestParameterMap().get("formId:radioId");
或
UIInput radio = (UIInput) viewRoot.findComponent("formId:radioId"); // Could if necessary be passed as component attribute.
String submittedValue = radio.getSubmittedValue(); // Only if radio component is positioned after input text, otherwise it's null if successfully converted/validated.
// or
String convertedAndValidatedValue = radio.getValue(); // Only if radio component is positioned before input text, otherwise it's the initial model value.
答案 1 :(得分:1)
它被称为跨领域验证(不仅根据组件的值进行验证,而且还根据组件的一组验证)。
目前,JSF2不支持它(JSF doesn't support cross-field validation, is there a workaround?)但是有几个库(在提到的问题中提到了omnifaces,它看起来像seamfaces也有一些东西)可能会有所帮助。问题还有一个解决方法。