1

我对 JSF 页面上的可能 AJAX 有疑问。他没有调用bean方法。转换器工作并返回一个正确的对象,但 bean 方法不调用。如果我删除执行部分方法调用。如果我删除转换器并仅发送 Id 方法调用。他们一起失败了。

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();

}
}

感谢您的评论。

4

2 回答 2

1

我已经解决了我的问题。那是在 selectOneMenu 中。主要问题是 selectOneMenu 中的itemValue必须与value的类型相同。所以我必须重写我的转换器,getAsString 方法。实体的方法也必须是这样

固定选择 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;
}
于 2013-01-02T11:15:08.280 回答
0

删除 f:ajax 上的侦听器并将 actionListener 添加到命令按钮。这有帮助吗?

于 2013-01-02T09:26:24.373 回答