2013-01-02 33 views
1

我在JSF頁面上可能AJAX有問題。他不會調用bean方法。轉換器工作並返回一個正確的對象,但bean方法不會調用。 如果我刪除執行部分方法調用。 如果我刪除逆變器並只發送Id方法調用。 他們一起失敗。JSF阿賈克斯和自定義轉換器

JSF頁面

<h:form id="jewelForm"> 
    <!-- ... --> 
    <h:selectOneMenu id="material" value="#{jewelBean.material}" > 
     <f:converter converterId="materialConverter"/> 
     <f:selectItems value="#{jewelBean.materialList}" var="c" 
         itemLabel="#{c.name}" itemValue="#{c.id}" /> 
    </h:selectOneMenu> 

    <h:commandButton id="but1" value="#{titles.addThisMat}"> 
     <f:ajax id ="aj1" 
       listener="#{jewelBean.addMaterial}" 
       render="jewelForm:matTable" 
       execute="material"/> 
    </h:commandButton> 

    <h:dataTable id ="matTable" 

    </h:dataTable> 
    <h:commandButton value="#{titles.createThisJ}" 
        action="#{jewelBean.saveJewel()}" /> 
</h:form> 

@ManagedBean(name = "jewelBean") 
@SessionScoped 
public class JewelBean implements Serializable { 

private Material material; 

public void addMaterial() { 
    MaterialJewel mj = new MaterialJewel(); 
    mj.setMaterial(material); 
    mj.setWeight(materialWeight); 
    materialJewels.add(mj); 
} 

public Material getMaterial() { 
    return material; 
} 

public void setMaterial(Material material) { 
    this.material = material; 
} 

}

轉換器

@FacesConverter("materialConverter") 
public class materialConverter implements Converter { 

@Override 
public Object getAsObject(FacesContext context, UIComponent component, String value) { 

    try { 
    //finding object with DAO 
     return material; 
     } 
    } catch (NumberFormatException ex) { 
     } 
} 

@Override 
public String getAsString(FacesContext context, UIComponent component, Object value) { 
    return value.toString(); 

} 
} 

感謝您的意見。

回答

0

我已經解決了我的問題。那是selectOneMenu。主要問題是itemValue in selectOneMenu must be the same type as value。所以我必須重寫我的轉換器,getAsString方法。同樣的方法等於實體必須像this

固定選擇在JSF頁面

<h:selectOneMenu id="material" value="#{jewelBean.material}" > 
     <f:converter converterId="materialConverter"/> 
     <f:selectItems value="#{jewelBean.materialList}" var="c" 
        itemLabel="#{c.name}" itemValue="#{c}" /> 
</h:selectOneMenu> 

固定轉換方法的

@Override 
public String getAsString(FacesContext context, UIComponent component, Object value) { 
    Material material = (Material) value; 
    return (material.getId() != 0) ? String.valueOf(material.getId()) : null; 
} 
0

刪除您的f:ajax上的監聽器,並將actionListener添加到您的commandbutton中。這有幫助嗎?

+0

沒有,我已經嘗試過了,並沒有幫助。 – kisileno