2012-08-02 264 views
1

我已經定義了一個f表示 調用的設定器:viewParam 如下面excrept所示:時究竟是

<html xmlns="http://www.w3.org/1999/xhtml" (...)> 

<f:metadata> 
    <f:viewParam name="cust-id" value="#{CustomerCEVController.customer}" 
     converter="#{customerConverter}" converterMessage="blah blah." 
     required="false" 
    /> 
</f:metadata> 


    <ui:composition template="/templates/commonLayout.xhtml"> 
     <ui:define name="title"> 
     (...) 
     <ui:define name="body"> 
     (...) 

元數據我的XHTML頁面上部作爲與下文F所示..並宣佈爲卡斯特-ID參數CustomerConverter類。該屬性卡斯特-ID和支持bean 客戶領域的getter方法的轉換器類的getAsObject方法都堪稱處理驗證 JSF生命週期階段稱爲之前客戶的setter方法字段被稱爲在更新模型值生命週期的階段。結果,在調用吸氣劑的時候,轉換器沒有正確地初始化該區域。這樣的序列是這樣的(其中CustomerCEVController是支撐類):

[處理驗證階段START]
[CustomerConverter#的getAsObject稱爲]
[CustomerCEVController#GETCUSTOMER稱爲]
[處理驗證相END]
[更新模型值START]
[CustomerCEVController#setCustomer稱爲]

我要報告基於日誌輸出的interspersion,我已經註冊了一個生命週期監聽序列。 我是否錯過了一些東西,如果沒有,我怎樣才能確保客戶的字段在轉換前被轉換器正確設置?

回答

4

順序是絕對的罰款。我不明白爲什麼這會對你造成問題。也許你在吸氣劑或二道助手中做了一些商業工作,而它根本不屬於這些方法?您需要一個<f:event type="preRenderView">來代替執行該業務工作。

吸氣劑是因爲在那一刻決定將做出是否發佈ValueChangeEvent與否驗證階段結束時調用。爲此,需要初始(「舊」)值,然後將其與提交/轉換/驗證(「新」)值進行比較。如果這些值不相等,則兩者都將作爲已發佈ValueChangeEvent的「舊」和「新」值傳遞。