2

inputText と submit ボタンの 3 つのラジオ ボタンがあります。特定のラジオが選択されたときに、送信時に入力テキストを検証したいだけです。ので、私は持っています

<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."));
      }
 }

これが機能しない原因の 1 つは、送信時にvalidateNumber(...)ラジオ ボタンのセッター メソッドの前に が実行されることsetSelectedRadio(String selectedRadio)です。したがって、このステートメントを引き起こす

 if(selectedRadio.equals("Some Value"){
       validate(selectedText);
 }

正しく実行しないこと。この問題を回避する方法について何か考えはありますか?

4

2 に答える 2

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.
于 2012-08-16T02:15:02.897 に答える
1

これは、クロス フィールド検証 (コンポーネントの値だけでなく、それらのセットに基づいて検証する) と呼ばれます。

現在、JSF2はそれをサポートしていません(JSFはクロスフィールド検証をサポートしていません。回避策はありますか?)が、いくつかのライブラリがあります(参照された質問でomnifacesが言及されていますが、seamfacesにも何かがあるようです)。ヘルプ。また、質問には回避策があります。

于 2012-08-15T23:24:16.487 に答える