2

我正在使用 Jsf 2.0 和 Primefaces 3.2 实现一个 webapp。我注意到了这种意想不到的行为:我有 aselectOneMenu和 a 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不是 a StringupdateSelectValues则不会调用该方法。我根本看不到任何异常或错误,只是没有被调用。这是支持bean:

private List<MyObj> myObjList;
private MyObj myObj;
// getters and setters

public void updateSelectValues() {
  System.out.println(this.myObj);
}

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

}
4

1 回答 1

8

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

<h:message>至于您的具体问题,如果您添加了一个<h:messages>或 PrimeFaces 等效于表单(并且还在 ajax 提交时更新了它),那么您应该已经注意到“空转换器”的转换错误。此外,如果您注意了服务器日志,您还应该看到有关未处理消息的警告。

您需要创建一个在其唯一表示Converter之间进行转换的自定义。例如:MyObjString

@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表示。

于 2012-05-15T13:33:28.567 回答