2013-01-02 86 views
1

我必須提供其需要值的選擇列表爲每次我用required時間,我使用requiredMessage時未輸入一個值,顯示一條消息。但他們都沒有爲我的選擇列表的工作這是如下圖所示:Primefaces選擇表「需要」驗證失敗

<p:pickList value="#{parameterValueDialog.selectedModelSeries}" 
      var="item" itemValue="#{item}" required="true" 
      converter="pickListConverter" requiredMessage="#{msg.validation_message}"> 

有沒有人有關於如何解決這個問題的想法?這是Primefaces庫本身的問題嗎?

編輯:發佈getAsObject()方法

@Override 

public final Object getAsObject(final FacesContext ctx, final UIComponent component, final String string) { 

Object returnObject = null; 
Object dualList = ((PickList) component).getValue(); 
DualListModel<Item<?>> listModel = (DualListModel<NamedItem<?>>) dualList; 
for (Item<?> item : listModel.getSource()) { 
    String id = String.valueOf(item.getId()); 
    if (string.equals(id)) { 
     returnObject = item; 
     break; 
     } 
    } 
    if (returnObject == null) { 
     for (Item<?> item : listModel.getTarget()) { 
      String id = String.valueOf(item.getId()); 
      if (string.equals(id)) { 
       returnObject = item; 
       break; 
      } 
     } 
    } 

return returnObject; 

}

+0

顯示轉換器的'getAsObject()'。那裏可能會導致問題。它可能錯誤地返回了一個空字符串值的非'null'。 – BalusC

+0

@BalusC - 包含的代碼。 – Rajath

回答

1

可以通過提供使用的驗證方法,在你的選擇列表解決您的問題。

在我的情況下,我的目標列表包含成員名稱,我必須確保該列表至少包含一個成員,並且第一個成員具有特殊狀態。您首先必須將由pickList返回的對象轉換爲DualListModel並獲得目標列表中的一個手牌。然後您可以檢查它是否爲空並執行任何其他需要的驗證。這裏是我的驗證方法:

public void valideLocationsResponsables(FacesContext contexte, UIComponent composant, Object locationResps) throws ValidatorException { 
    DualListModel<LocationsResponsables> dualListModel; 
    if (locationResps instanceof DualListModel) { 
     dualListModel = (DualListModel<LocationsResponsables>) locationResps; 
     List<LocationsResponsables> listeResponsables = dualListModel.getTarget(); 
     ListIterator<LocationsResponsables> iterateur = listeResponsables.listIterator(); 
     // Your validation criteria here 
     if (listeResponsables.isEmpty() || !iterateur.next().getIdMembreReserv().getStatut().isPeutReserver()) { 
      ((UIInput) composant).setValid(false); // Pick list is made invalid 
      FacesMessage msgErreur = new FacesMessage(); 
      msgErreur.setSeverity(FacesMessage.SEVERITY_ERROR); 
      msgErreur.setDetail("Your error message here"); 
      throw new ValidatorException(msgErreur); 
     } 
    } 
} 

如下驗證方法掛鉤到選擇列表與驗證關鍵字:

 <p:pickList id="listeResp" value="#{locationsControleur.locationsResponsablesListe}" var="resp" effect="puff" 
          itemValue="#{resp}" itemLabel="#{resp.idMembreReserv.prenomNom}" 
          converter="#{locationsResponsablesListeConvertisseur}" 
          validator="#{locationsControleur.valideLocationsResponsables}"> 
       <f:facet name="sourceCaption">#{msgs.LocationsMembresEligibles}</f:facet> 
       <f:facet name="targetCaption">#{msgs.LocationsResponsablesChoisis}</f:facet> 
     </p:pickList> 
       <p/><p/> 
       <h:message id="listeRespMsg" for="listeResp" errorStyle="color: red"/> 

希望這可以幫助。