2

複合コンポーネントの要素で実行するカスタム バリデータをセットアップしました。次のようになります。

<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>

私はそれを間違っていますか?

4

1 に答える 1

3

<f:validateRequired>、Web アプリケーションで JSR303 Bean 検証が有効になっている場合にのみ機能します (これは通常、Glassfish、JBoss AS、TomEE などの Java EE Web プロファイル互換サーバーでは有効ですが、Tomcat などの単純なサーブレット コンテナーでは有効ではありません)。Web アプリケーションにない場合は、次のように空のフィールドの Bean 検証を手動で強制する必要がありますweb.xml

<context-param>
    <param-name>javax.faces.VALIDATE_EMPTY_FIELDS</param-name>
    <param-value>true</param-value>
</context-param>
于 2013-01-23T13:04:57.970 に答える