2012-05-15 58 views
2

我正在使用Jsf 2.0和Primefaces 3.2實現web應用程序。 我已經注意到這個意外behavoiur:我有一個selectOneMenucommandButton,如下Primefaces selectOneMenu偵聽器不用字符串以外的對象調用

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

什麼情況是,如果myObj不是String,則updateSelectValues方法不叫。我看不到任何異常或錯誤,它只是沒有被調用。下面是支持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(); 
    } 

} 

回答

8

這是因爲HTML和HTTP不理解Java對象。當JSF生成HTML時,所有Java對象都轉換爲String。當提交的表單數據由JSF處理時,所有HTTP請求參數String應該轉換回Java對象。

至於你的具體問題,如果你添加了一個<h:message><h:messages>或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表示。

相關問題