12

我有一个 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(我假设这是因为连接到视图参数而发生的),但不能读取任何其他属性。任何想法如何解决这一问题?

4

1 回答 1

26

你需要一个<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 将提供一个新的、更合理的标签,其唯一目的是:<f:viewAction>.

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

也可以看看:

于 2012-04-21T17:58:53.470 回答