0

我在用来编辑“事件”的页面中有这个

<f:metadata>
    <f:viewParam id="event_id" name="eventId" value="#{eventController.eventId}"/>
    <f:event type="preRenderView" listener="#{eventController.loadEvent}" />
</f:metadata>

...以及我的“ViewScoped”bean 中的相应 loadEvent 方法。

在用户可以选择要编辑的事件的“列表事件”页面中,我建立了这样的链接

<h:link value="Full details" outcome="/calendar/viewEvent" includeViewParams="true">
    <f:param name="eventId" value="#{calendarController.event.eventId}" />
</h:link>

在单击链接之前,我不希望调用 loadEvent 方法,但是当我访问“列表事件”页面时,它会被调用一次,并且仅调用一次。

当然,这以某种方式归结为 JSF 生命周期……但是为什么呢?

4

1 回答 1

3

我也在 Mojarra 2.1.10 上遇到过这种情况(我假设你也在 Mojarra 上?)。该错误已作为JAVASERVERFACES-2158提交,在撰写本文时没有修复或解决方法。问题是这样的:在渲染UIOutcomeTarget组件(例如包含视图参数h:link)时完成抢先导航期间,目标视图被编译为从其元素中提取/组件。此编译的副作用是还基于当前设置了事件订阅h:button f:viewParamUIViewParameterh:metadata UIViewRootf:event元素。在正常情况下——即在响应中返回给用户的视图正在编译时——这一切都很好。但是,当编译另一个视图以获取其视图参数时,在当前视图根(如 中FacesContext.getViewRoot())上注册事件订阅根本不合适。

于 2012-09-06T12:28:05.143 回答