2012-08-02 166 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的“旧”和“新”值传递。