什么时候<f:metadata> <f:viewparam>的setter被调用</f:viewparam> </f:metadata>

时间:2012-08-02 10:48:33

标签: java jsf lifecycle viewparams

我在xhtml页面上定义了一个 f:metadata 部分,如下所示,带有 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">
        (...)

..并为 cust-id 参数声明了一个CustomerConverter类。属性 cust-id 的转换器类 getAsObject 方法和支持bean customer 字段的getter方法都在中调用流程验证 JSF生命周期阶段称为 BEFORE customer 字段的setter方法,该字段在 UPDATE MODEL VALUES 生命周期中调用相。结果,在调用getter时,转换器未正确初始化该字段。所以序列是这样的(CustomerCEVController是支持bean类):

[流程验证阶段START ]
[CustomerConverter#getAsObject called]
[CustomerCEVController#getCustomer调用]
[流程验证阶段结束]
[ UPDATE MODEL VALUES START ]
[CustomerCEVController #setCustomer called]

我根据记录输出和我注册的生命周期监听器的散布来报告序列。 我错过了什么,如果没有,我怎样才能确保转换器在访问之前正确设置客户字段?

1 个答案:

答案 0 :(得分:4)

序列绝对没问题。我不明白为什么这对你来说是一个问题。也许你在getter或setter做一些业务工作,而它根本不属于那些方法?您需要<f:event type="preRenderView">才能执行该业务工作。

在验证阶段结束时调用了getter,因为此时将决定是否发布ValueChangeEvent。为此,需要初始(“旧”)值,然后将其与提交/转换/验证(“新”)值进行比较。当这些值不相等时,两者都将作为已发布ValueChangeEvent的“旧”和“新”值传递。