複合コンポーネントの要素で実行するカスタム バリデータをセットアップしました。次のようになります。
<myproject:myComponent>
<f:validator validatorId="customValidator" for="validatedField" />
</myproject:myComponent>
複合コンポーネントは次のようになります。
<composite:interface>
<composite:editableValueHolder name="validatedField" targets="validatedField" />
</composite:interface>
<composite:implementation>
<h:inputText id="validatedField" />
</composite:implementation>
ほとんどの場合は機能していますが、問題が 1 つあります。フィールドを必須として指定するにはどうすればよいですか?
検証済みフィールドを完全に空白のままにすると、カスタムバリデーターがまったく呼び出されないようです。<f:validateRequired for="validatedField" />
の中に を追加しようとしましたmycomponent
が、うまくいきませんでした。
編集(BalusC に応じて): 複合コンポーネントが表示されるコンテキストのより詳細な説明:
<p:outputPanel id="pnlElements">
<ui:repeat value="#{backingViewBean.elementDtos}" var="elementDto">
<p:commandButton value="Edit..."
action="#{backingControllerBean.refreshView}"
ajax="true"
update=":frmMain:editElement"
oncomplete="wdgEditElement.show()">
<f:setPropertyActionListener
target="#higherLevelControllerBean.currentElementId}"
value="#{elementDto.Id}" />
</p:commandButton>
</ui:repeat>
</p:outputPanel>
<p:dialog widgetVar="wdgEditElement" modal="true">
<p:outputPanel id="editElement">
<myproject:myComponent>
<f:validator validatorId="customValidator" for="validatedField" />
</myproject:myComponent>
</p:outputPanel>
</p:dialog>
このページには、私が作成した要素のリストが表示され、それぞれに編集ボタン (および省略しているその他のもの) が表示されます。編集ボタンをクリックすると、要素を編集できる複合コンポーネントを含むウィンドウがポップアップ表示されます (わかりやすいように保存ボタンも省略されています)。
問題は、 に設定javax.faces.VALIDATE_EMPTY_FIELDS
するtrue
と、編集ウィンドウに入力されたデータ オブジェクトが設定される前にバリデーターが呼び出され、空のフィールドがあると吠えることです。(そして、データ オブジェクトが設定される前に実行を中止するため、すべてのフィールドが空に見えます。)
(さらに、 whenVALIDATE_EMPTY_FIELDS
が に設定されている場合false
、2 回目以降に [編集] ボタンをクリックすると、バリデーターへの呼び出しもトリガーされることに気付きました。これは無害に見えますが、私が期待していた動作ではありません。)
私は Glassfish の下で実行しているので、動作していると思い<f:validateRequired>
ますが、間違った使い方をしている可能性があります。私はこのようにそれを使用していました:
<myproject:myComponent>
<f:validator validatorId="customValidator" for="validatedField" />
<f:validateRequired for="validatedField" />
</myproject:myComponent>
私はそれを間違っていますか?