JSF:如何仅在选择另一个组件时验证inputText

时间:2012-08-15 22:50:43

标签: jsf jsf-2

我有三个单选按钮,一个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);
 }

无法正确执行。如何解决这个问题?

2 个答案:

答案 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也有一些东西)可能会有所帮助。问题还有一个解决方法。