Jsf 2 Primefaces selectOneMenu侦听器未使用字符串以外的对象调用

Jsf 2 Primefaces selectOneMenu侦听器未使用字符串以外的对象调用,jsf-2,primefaces,tomcat7,Jsf 2,Primefaces,Tomcat7,我正在使用JSF2.0和PrimeFaces3.2实现一个webapp。 我注意到了一个意想不到的行为:我有一个selectOneMenu和一个commandButton,如下所示 <p:selectOneMenu id="selsel" value="#{bean.myObj}"> <f:selectItems value="#{bean.myObjList}" /> </p:selectOneMenu> <p:commandButton id="

我正在使用JSF2.0和PrimeFaces3.2实现一个webapp。 我注意到了一个意想不到的行为:我有一个
selectOneMenu
和一个
commandButton
,如下所示

<p:selectOneMenu id="selsel" value="#{bean.myObj}">
  <f:selectItems value="#{bean.myObjList}" />
</p:selectOneMenu>
<p:commandButton id="btnid" value="Ok" actionListener="#{bean.updateSelectValues()}" />
myObj的代码:

public class MyObj implements Serializable {

  private static final long serialVersionUID = 1L;

  private String param1;
  private int param2;

  @Override
  public String toString() {
    StringBuilder builder = new StringBuilder();
    builder.append("MyObj [param1=");
    builder.append(this.param1);
    builder.append(", param2=");
    builder.append(this.param2);
    builder.append("]");
    return builder.toString();
  }

}

这是因为HTML和HTTP不理解Java对象。当JSF生成HTML时,所有Java对象都转换为
String
。当提交的表单数据要由JSF处理时,所有HTTP请求参数
String
都应该转换回Java对象

至于您的具体问题,如果您添加了一个
或与表单等效的PrimeFaces(并且在ajax提交时对其进行了更新),那么您应该注意到“null converter”的转换错误。另外,如果您已经注意到服务器日志,您还应该看到一条关于未处理消息的警告

您需要创建一个在
MyObj
和其唯一的
String
表示之间转换的自定义。例如:

@FacesConverter(forClass=MyObj.class)
public class MyObjConverter implements Converter {

    @Override
    public String getAsString(FacesContext context, UIComponent component, Object valueToRender) {
        // Convert MyObj to its unique String representation.
    }

    @Override
    public Object getAsObject(FacesContext context, UIComponent component, String submittedValue) {
        // Convert String to MyObj.
    }

}
通常,这些对象已经存储在某个数据库中或通过其ID进行映射。然后,您可以使用该ID作为唯一的
String
表示

@FacesConverter(forClass=MyObj.class)
public class MyObjConverter implements Converter {

    @Override
    public String getAsString(FacesContext context, UIComponent component, Object valueToRender) {
        // Convert MyObj to its unique String representation.
    }

    @Override
    public Object getAsObject(FacesContext context, UIComponent component, String submittedValue) {
        // Convert String to MyObj.
    }

}