2
votes

Recently I have update my application to JSF 2.1.7 and PrimeFaces 3.4.2. When the below dialog is used for adding a new group, I get an "Name size must be between 1 and 40" validation error, prior to saving the new group. It happens when I click the picker's add button. I understand that this message is shown because the validation failed. The validation error doesn't appear when I add immediate=true to p:commandButton. I don't know what triggered the validation.

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

The picker is similar to <p:password> and it is made up from two p:dataTable components and 4 buttons between them. The buttons are grouped together with a h:panelGrid. The button attributes are similar. Here is button sample code:

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

source, target are the ids of the two datatables. pickerAdd is passed as param with a value of groupsBean.picker.add. The tables contain FooDomain objects.

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

1 Answers

5
votes

The PrimeFaces <p:commandButton> processes by default the entire form (as in, process="@form"), so it would by default trigger all validations. Your validation error is coming from the @Size restriction on the property. If you would like to process only the button's own action, then you should add process="@this".

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

The immediate="true" can also be used to solve it, but it behaves under the covers somewhat different: the entire form is still processed, but the action is invoked in APPLY_REQUEST_VALUES phase instead of INVOKE_ACTION phase. And only the input components which also have immediate="true" set will also be processed and others will be skipped.