何时调用 <f:metadata><f:viewParam> 的设置器

Posted

技术标签:

【中文标题】何时调用 <f:metadata><f:viewParam> 的设置器【英文标题】:when exactly is the setter for <f:metadata><f:viewParam> invoked 【发布时间】:2012-07-31 07:56:31 【问题描述】:

我在我的 xhtml 页面上定义了一个 f:metadata 部分,如下所示,其中一个 f:viewParam 如下所示:

<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 生命周期阶段称为 BEFOREUPDATE MODEL VALUES 生命周期中调用的 customer 字段的 setter 方法阶段。结果,在调用 getter 时,转换器未正确初始化该字段。所以顺序是这样的(其中 CustomerCEVController 是支持 bean 类):

[ 过程验证阶段开始 ] [ 调用 CustomerConverter#getAsObject ] [ CustomerCEVController#getCustomer 已调用 ] [ 过程验证阶段结束 ] [ 更新模型值开始 ] [CustomerCEVController#setCustomer 被调用]

我根据日志输出和我注册的生命周期侦听器的散布报告序列。 我是否遗漏了什么,如果没有,我如何确保转换器在访问之前正确设置了客户字段?

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

以上是关于何时调用 <f:metadata><f:viewParam> 的设置器的主要内容,如果未能解决你的问题,请参考以下文章

如果位于 template.xhtml 中,JSF f:viewParam 不调用 setter

元数据组件需要嵌套在 f:metadata 标记中。建议:将必要的组件包含在 <f:metadata> 中

使用 <ui:composition> 模板时,我应该在哪里声明 <f:metadata>?

使用 <ui:composition> 模板时,我应该在哪里声明 <f:metadata>?

是否将 f:event 放在 f:metadata 中是否重要?

f:viewParam 在 ajax 调用后丢失