2

Jsf2.0とPrimefaces3.2を使用してWebアプリを実装しています。私はこの予期しない振る舞いに気づきました:私は以下のように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がない場合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オブジェクトはString、HTMLがJSFによって生成されるときに変換されます。String送信されたフォームデータがJSFによって処理されるときに、Javaオブジェクトに変換されることになっているすべてのHTTPリクエストパラメータ。

具体的な問題に関しては、フォームに相当する<h:message><h:messages>またはPrimeFacesを追加した場合(およびajax送信時に更新した場合)、「nullコンバーター」の変換エラーに気付くはずです。また、サーバーログに注意を払っていれば、未処理のメッセージに関する警告も表示されているはずです。

とその一意の表現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 に答える