2

最近、アプリケーションをJSF2.1.7とPrimeFaces3.4.2に更新しました。以下のダイアログを使用して新しいグループを追加すると、新しいグループを保存する前に、「名前のサイズは1〜40でなければなりません」という検証エラーが発生します。ピッカーの追加ボタンをクリックすると発生します。検証に失敗したため、このメッセージが表示されることを理解しています。immediate=truep:commandButtonに追加しても、検証エラーは表示されません。何が検証をトリガーしたのかわかりません。

<h:form id="formg" prependId="false">
    <!-- messages -->
    <p:growl id="msgsg" showDetail="true" />

    <!-- data table -->
    <ui:include src="/WEB-INF/flows/groupsTable.xhtml" />

    <p:separator />

    <!-- bottom tool bar -->
    <ui:include src="/WEB-INF/flows/groupsToolBar.xhtml" />

    <!-- preview, edit dialog -->
    <ui:include src="/WEB-INF/flows/groupsDialog.xhtml" />
</h:form>

<p:dialog id="dialogg" header="#{groupsBean.dialogTitle}"
    widgetVar="groupsDialog" dynamic="true" resizable="false" width="800"
height="600" showEffect="fade" hideEffect="fade" modal="true">
    <p:ajax event="close" listener="#{groupsBean.refresh}"
        immediate="true" update=":formg" global="false" process="@this" />

    <p:tabView id="tabPicker">
        <p:tab title="General">
            <h:panelGrid id="displayg" columns="2">
                <h:outputText value="#Group name*:" />
                <p:inputText value="#{groupsBean.selectedGroup.name}" size="40"
                    readonly="#{!groupsBean.updatable}" maxlength="40" />
            </h:panelGrid>
        </p:tab>
        <p:tab title="Members">
            <ui:include src="/WEB-INF/custom/picker.xhtml">
                ... some params passed to picker
            </ui:include>
        </p:tab>
    </p:tabView>
</p:dialog>

ピッカーはに似て<p:password>おり、2つのp:dataTableコンポーネントとそれらの間の4つのボタンで構成されています。ボタンはah:panelGridと一緒にグループ化されます。ボタンの属性は似ています。ボタンのサンプルコードは次のとおりです。

<p:outputPanel autoUpdate="true">
    <p:commandButton actionListener="#{eval.evaluateAsMethod(pickerAdd)}"
    update="source, target, #{messages}" immediate="true"
    disabled="#{pickerSourceDisabled}"
    icon="ui-icon ui-icon-arrowthick-1-s" />
</p:outputPanel>

sourcetargetは、2つのデータテーブルのIDです。pickerAddは、値が。のparamとして渡されますgroupsBean.picker.add。テーブルにはFooDomainオブジェクトが含まれています。

public class FooDomain implements Serializable {
    ...
    @NotNull  
    @Size(min = 1, max = 40)
    @Column(name = "NAME")
    private String name;
    ...
}
4

1 に答える 1

5

PrimeFaces<p:commandButton>は、デフォルトでフォーム全体を処理するため(process="@form"、のように)、デフォルトですべての検証がトリガーされます。検証エラーは@Size、プロパティの制限に起因しています。ボタン自体のアクションのみを処理する場合は、を追加する必要がありますprocess="@this"

<p:commandButton ... process="@this" />

を使用して解決するimmediate="true"こともできますが、内部での動作は多少異なります。フォーム全体は引き続き処理されますが、アクションはINVOKE_ACTIONフェーズではなくAPPLY_REQUEST_VALUESフェーズで呼び出されます。また、設定されている入力コンポーネントのみimmediate="true"が処理され、その他はスキップされます。

于 2013-01-16T10:56:02.540 に答える