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 メソッドを書き直す必要があります。また、エンティティのメソッド equals は、このようにする必要があります。

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 に答える