2011-09-13 9 views
2

私は自分のプロジェクトのカスタムバリデーターを作成しました。単に選択された値をチェックし、値が '0'でないことを '確認'します。その後、正常に動作しますが、<f:validator disabled flag not working

<f:selectItem itemValue="0" 
       itemLabel="-- Select One --"/> 

は、コンポーネントが常に必要なチェックに合格します:私たちは、手動に、当社のselectOneMenuのcompentsの最初の値を設定する(私は珍しいことではありません確信している)標準を持っています。したがって、このバリデーターは単にこの値を選択が行われていないかのように扱います。

SelectOneMenu例:

<h:selectOneMenu id="eligibility" 
      value="#{reg.eligibility}" 
      required="#{reg.fieldsRequired}"> 
<f:selectItem itemValue="0" 
       itemLabel="-- Select One --"/> 
<f:selectItems value="#{reg.eligibilityList}" /> 
<f:validator validatorId="selectOneValidator" 
      disabled="#{!reg.fieldsRequired}"/> 

カスタムバリデータ:

@FacesValidator("selectOneValidator") 

パブリッククラスSelectOneValidatorバリデータ{

@Override 
public void validate(FacesContext context, UIComponent uiComponent, Object o) throws ValidatorException { 
    String val = null; 
    if (uiComponent instanceof HtmlSelectOneMenu) { 
     HtmlSelectOneMenu oneMenu = (HtmlSelectOneMenu) uiComponent; 


     if (oneMenu.isRequired() && !oneMenu.isDisabled()) { 
      if (o instanceof String) { 
       val = (String) o; 
      } else if (o instanceof Number) { 
       val = String.valueOf(o); 
      } 

      if ("0".equals(val)) { 
       FacesMessage msg = new FacesMessage(); 
       msg.setSummary("Please select a value from the list."); 
       msg.setSeverity(FacesMessage.SEVERITY_ERROR); 
       throw new ValidatorException(msg); 
      } 
     } 
    } 
} 

}これはヲ有する

を実装これまでのところうまくいきましたが、現在の私の場合は問題に陥っています。 マイページには複数のSelectOneMenusがあり、そのうちの1つは必須属性と無効属性をページのajax呼び出しでトグルします。しかし、required="#{reg.fieldsRequired}"に問題はありません。私のカスタムバリデーターのdisabled="#{!reg.fieldsRequired}"属性は違いはありません。私は大声で考えているだけですが、ページが最初にロードされるとき#{reg.fieldsRequired}という表現は偽です。このブール値をtrueに設定するためにSelectOneMenuを変更し、送信ボタンを押すと、無効な属性が設定されていないように見えます。私はこれが単なるajaxの問題であり、すべてのコンポーネントを再レンダリングする必要があるのか​​と思ったので、私のajaxコールに@formを追加しました:<a4j:ajax render="@form" listener="#{reg.saveActionChanged}"/>が問題を修正することを期待していますが、動作に違いはありません。

環境:
JSF 2.0.3
のTomcat 6.0.14
AJAX呼び出しは、すべてのヘルプが最も高く評価されたRichFaces 4.0

で作られています!

答えて

2

申し訳ありませんが、私はJSF 2.1.3で問題を再現できません。 <f:validator disabled>は期待どおりに動作します。

ただし、まったく別の方法として、標準のrequiredバリデータを使用することができます。 0ではなく、項目値を#{null}に設定する必要があります。

<f:selectItem itemValue="#{null}" itemLabel="-- Select One --"/> 

このように、カスタムバリデータは必要ありません。メッセージは、入力コンポーネントの属性としてrequiredMessageと設定できます。

<h:selectOneMenu requiredMessage="Please select a value from the list."> 
+0

これは私がこれをやっていたやり方を変えて単純に値をnullに設定したことに言及しておもしろいです。私は実際にそれを考えました(もちろん私が投稿した後)。 intフィールドにnull値を設定しようとしたためにエラーが発生しました。私は本当に無効な属性とのいくつかの並べ替えのバグのために私のachitrectureを変更する必要はありませんので、このdesiabledものと戦っている。私はちょうどそれについてこれで私の知恵の終わりであるので、その中間のための解決策かもしれない。 – Mickelback

+0

'int'ではなく' Integer'を使います。 Nullableモデル値はプリミティブであってはなりません。 – BalusC

+0

テストケースの不安定さを解消するだけでは(再生することを望むならば)、SelectOneMenuは、リスナーを介してrequired/disabledフラグを設定するだけです。これが設定されたら、CommandButtonをクリックしてサーバーに送信し、必要/無効を決定するブール値に関係なく、必要な属性のみが正しく動作するように見えます。無効にされた属性は、その値が設定されている値よりも少ないように見えます。私はのrenderd属性に '@ form'と' @ all'を設定しようとしましたが、運がまだありません。 – Mickelback