【问题标题】:JSF ajax and custom converterJSF ajax 和自定义转换器
【发布时间】:2012-12-16 15:30:33
【问题描述】:

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

}
}

感谢您的 cmets。

【问题讨论】:

    标签: java ajax jsf converter managed-bean


    【解决方案1】:

    我已经解决了我的问题。那是在 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;
    }
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 2012-03-15
        • 1970-01-01
        • 2012-10-17
        • 2012-10-26
        • 2013-10-11
        • 1970-01-01
        • 2012-07-21
        • 1970-01-01
        • 2015-11-24
        相关资源
        最近更新 更多