I have a problem with may AJAX on JSF page. He doesn't call the bean method. Converter works and returns a correct object, but bean method doesn't call. If I remove execute section method calls. If I remove coverter and send only Id method calls. Together they fail.
JSF page
<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>
bean
@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;
}
}
converter
@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();
}
}
Thank for your comments.
remove listener on your f:ajax and add actionListener to your commandbutton. Does that help?
I have solved my problem. That was in selectOneMenu. The main problem was that itemValue in selectOneMenu must be the same type as value. So I have to rewrite my converter, getAsString method. Also method equals of entity must be like this.
fixed select on of JSF page
<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>
fixed convertor method
@Override
public String getAsString(FacesContext context, UIComponent component, Object value) {
Material material = (Material) value;
return (material.getId() != 0) ? String.valueOf(material.getId()) : null;
}