2012-05-21 105 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