JSF bean:设置 ViewParam 后调用 @PostConstruct 函数

Posted

技术标签:

【中文标题】JSF bean:设置 ViewParam 后调用 @PostConstruct 函数【英文标题】:JSF bean: call @PostConstruct function after ViewParam is set 【发布时间】:2012-05-02 22:30:18 【问题描述】:

我有一个 product.xhtml 和一个 ProductBean。我使用 /product/id 来访问产品,因此我在 product.xhtml 中有一个 viewParam,其 value=ProductBean.id。问题是在 bean 内部,我使用带有 PostConstruct 注释的 init 函数来填充产品的详细信息。为此,我需要 id 来调用外部函数。我想尽管在 viewParam 设置 bean 的 id 之前调用了 init,因此在 init 内部我无法调用外部函数,因为 id 尚未设置。我做错了什么,我该如何解决?

更新

我发现了问题所在。我认为 viewParam 方法适用于 CDI bean,但 ManagedProperty 方法适用于 JSF bean..

我现在确实有另一个问题。我的 CDI bean 是 RequestScoped,当 product.xhtml 被渲染时,bean 被创建,我猜后来被丢弃了。有趣的是,我在该 bean 中有一个函数,当我调用它时,我可以读取 id(我认为这是因为连接到视图参数而发生的),但不能读取任何其他属性。任何想法如何解决这个问题?

【问题讨论】:

关于您的更新,您对 viewParam 的陈述是错误的。 <f:viewParam> 并非特定于 CDI。无论谁在管理 bean,这都有效。 @ManagedProperty 确实仅在 JSF @ManagedBean 中有效,但这并不明显,因为 @ManagedProperty 是特定于 JSF 的注释,而不是特定于 CDI 的注释。 【参考方案1】:

您需要<f:event type="preRenderView">

<f:metadata>
    <f:viewParam name="foo" value="#bean.foo" />
    <f:event type="preRenderView" listener="#bean.onload" />
</f:metadata>

public void onload() 
    // ...

请注意,这本质上是一个小技巧。即将推出的 JSF 2.2 将提供一个新的、更合理的标签,其唯一目的是:&lt;f:viewAction&gt;

<f:metadata>
    <f:viewParam name="foo" value="#bean.foo" />
    <f:viewAction action="#bean.onload" />
</f:metadata>

另见:

ViewParam vs @ManagedProperty(value = "#param.id") Communication in JSF 2.0 - Processing GET request parameters

【讨论】:

我添加了你的建议,但我仍然无法读取 init 中的 id 我无法使用您发布的第一个链接中的第一种方法,但我可以使用第二种方法。虽然我知道第一种方法比第二种方法好,这是正确的吗? 很难说没有看到一些具体的代码。我敢打赌你做错了什么。 这里的想法是完全跳过@PostConstruct注解并依赖从preRenderView调用的init? 我是 f:event 在回发时调用,如果初始化已经完成,我必须添加标志,是否可以只调用一次该事件,例如使用 @PostConstruct?

以上是关于JSF bean:设置 ViewParam 后调用 @PostConstruct 函数的主要内容,如果未能解决你的问题,请参考以下文章

f:viewParam 在 ajax 调用后丢失

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

如何在不调用 <f:viewparam> 转换器的情况下调用 setter?

JSF ViewParam 必需 +AJAX 中断页面

当 URL 中没有参数时,将 f:viewParam 属性设置为 null

Spring 安全性和 JSF:在登录时调用支持 bean 的方法?