2013-01-16 45 views
2

最近我已將我的應用程序更新到JSF 2.1.7和PrimeFaces 3.4.2。當下面的對話框用於添加新組時,我會在保存新組之前得到一個「名稱大小必須在1到40之間」驗證錯誤。當我點擊選擇器的添加按鈕時會發生這種情況。我知道顯示此消息是因爲驗證失敗。當我將immediate=true添加到p:commandButton時,不會出現驗證錯誤。我不知道是什麼觸發了驗證。JSF/PrimeFaces對話框中的Javabean驗證錯誤

<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>並且它是從兩個p由:dataTable的組件和它們之間的4個按鈕。這些按鈕與h: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> 

目標是兩個DataTable的ID。 pickerAdd作爲參數傳遞,值爲groupsBean.picker.add。這些表包含FooDomain對象。

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

回答

5

的PrimeFaces <p:commandButton>處理由默認的整個形式(如在,process="@form"),所以這將通過默認觸發所有驗證。您的驗證錯誤來自該屬性的@Size限制。如果您只想處理按鈕自己的操作,那麼您應該添加process="@this"

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

immediate="true"也可用於解決這個問題,但它在底層的行爲有些不同:整個表格還在處理,但該動作在APPLY_REQUEST_VALUES相位而不是INVOKE_ACTION階段被調用。並且只有輸入組件immediate="true"設置也將被處理,其他將被跳過。

+0

Dank u veel voor uw hulp。 – Seitaridis

+0

不客氣:) – BalusC