2012-05-21 99 views
0

我實現了允許我顯示取決於另一個的下拉列表的代碼。一切正常,只是當我嘗試檢索和顯示兩個字段的值精細,它提出了以下錯誤:selectOneMenu驗證錯誤

form:parcours : erreur : de validation. la valeur est incrorrecte

英語

form:parcours : validation error. value is not valid

我使用JSF 2.0,EJB 3.0, JPA 2.0和PrimeFaces 3.2。

查看:

<h:form id="form" > 

<!-- <p:growl id="msgs" showDetail="true"/> --> 
<h:messages globalOnly="true"/> 
<p:growl id="msgs" showDetail="true" /> 


<p:panel header="Double Combo" style="margin-bottom:10px;"> 
    <h:panelGrid columns="2" cellpadding="5"> 

     <p:selectOneMenu id="countries" value="#{plansEtude.selectedDep}"> 
      <f:selectItem itemLabel="Select Country" itemValue="" /> 
      <f:selectItems value="#{plansEtude.depList}" var="c" itemLabel="#{c.nomDepFr}" itemValue="#{c.id}"/> 
      <p:ajax update="parcours,parcoursTab" 
        listener="#{plansEtude.handleDepChange}" /> 
     </p:selectOneMenu> 
     <p:selectOneMenu id="parcours" value="#{plansEtude.selectedParcours}" > 
      <f:convertNumber maxFractionDigits="0"/> 
      <f:selectItem itemLabel="Select City" itemValue="" /> 
      <f:selectItems value="#{plansEtude.parcoursList}" var="ct" itemLabel="#{ct.designParcours}" itemValue="#{ct.id}" /> 

     </p:selectOneMenu> 

    </h:panelGrid> 
    <p:separator /> 

     <p:commandButton value="Submit" update="msgs" actionListener="#{plansEtude.displayLocation}" id="btnSubmit"/> 

    </p:panel> 

控制器:

@EJB 
private DepartementFacade departementFacade; 
@EJB 
private ParcoursFacade parcoursFacade; 
private List<Departement> depList; 
private List<Parcours> parcoursList; 
private Integer selectedDep; 
private Integer selectedParcours; 


public PlansEtude() { 
} 

public DepartementFacade getDepartementFacade() { 
    return departementFacade; 
} 

public void setDepartementFacade(DepartementFacade departementFacade) { 
    this.departementFacade = departementFacade; 
} 

public ParcoursFacade getParcoursFacade() { 
    return parcoursFacade; 
} 

public void setParcoursFacade(ParcoursFacade parcoursFacade) { 
    this.parcoursFacade = parcoursFacade; 
} 

public List<Departement> getDepList() { 
    depList = getDepartementFacade().findAll(); 
    return depList; 
} 

public void setDepList(List<Departement> depList) { 

    this.depList = depList; 
} 

public List<Parcours> getParcoursList() { 
    return parcoursList; 
} 

public void setParcoursList(List<Parcours> parcoursList) { 
    this.parcoursList = parcoursList; 
} 

public Integer getSelectedDep() { 
    return selectedDep; 
} 

public void setSelectedDep(Integer selectedDep) { 
    this.selectedDep = selectedDep; 
} 

public Integer getSelectedParcours() { 
    return selectedParcours; 
} 

public void setSelectedParcours(Integer selectedParcours) { 
    this.selectedParcours = selectedParcours; 
} 

public void handleDepChange(){ 
    if(selectedDep !=null && !selectedDep.equals("")) 

     parcoursList = parcoursFacade.findParcoursInDep(selectedDep); 
    else 
     parcoursList = new ArrayList<Parcours>(); 

} 

public void handleParcoursChange(){ 

} 

public void displayLocation() { 
    String monMessage="Departement :" + selectedDep + ", Parcours : " + selectedParcours; 
    FacesMessage msg = new FacesMessage("Selected", monMessage); 

    FacesContext.getCurrentInstance().addMessage(null, msg); 
} 

}

parcoursFacade:

public List<Parcours> findParcoursInDep(Integer dep){ 
    Query query = em.createNamedQuery("Parcours.findParcoursInDep"); 
    query.setParameter("dep", dep); 
    return (List<Parcours>)query.getResultList(); 
} 

命名查詢:

 @NamedQuery(name = "Parcours.findParcoursInDep", query = "SELECT p FROM Parcours p WHERE p.departementid.id = :dep"), 
+0

如果表單中存在驗證錯誤,那麼它不會被提交,所以不會調用displayLocation()方法。爲什麼添加到第二個selectOneMenu? 另外,我沒有看到窗體標籤的關閉,窗體中是否還有其他輸入組件?它有驗證嗎? – Damian

回答

2

從parcours下拉列表中刪除<f:convertNumber maxFractionDigits="0"/>。這個不成立。它只會將數字轉換爲BigDecimal,而您需要Integer

另一個可能的原因是#{plansEtude.parcoursList}在表單提交過程中發生了不兼容的變化,因爲託管bean是請求作用域。您需要確保託管bean至少放在視圖範圍內,以便保留提交的parcoursList

+0

謝謝你的幫助:) –

+0

不客氣。 – BalusC