我有一个@ViewScope ManagedBean 和一个@PostConstruct 初始化方法。此方法在创建新实例时调用,但也在每次 ajax 调用时调用。为什么会这样?
在 AJAX 调用中,会调用并执行 init-Method,但看不到任何更改。例如,如果我在 init-Method 中更改了一个属性,这仅在实例化时可见,而对于 AJAX 调用不可见。对于 AJAX 调用,值更改不会在 @ViewScoped Bean 中持久存在。
谁能说出为什么会这样?我怎样才能改变这个?
我有一个@ViewScope ManagedBean 和一个@PostConstruct 初始化方法。此方法在创建新实例时调用,但也在每次 ajax 调用时调用。为什么会这样?
在 AJAX 调用中,会调用并执行 init-Method,但看不到任何更改。例如,如果我在 init-Method 中更改了一个属性,这仅在实例化时可见,而对于 AJAX 调用不可见。对于 AJAX 调用,值更改不会在 @ViewScoped Bean 中持久存在。
谁能说出为什么会这样?我怎样才能改变这个?
这不是正常行为。如果在binding
打开部分状态保存的情况下将标记处理程序属性或 JSF 组件的属性绑定到视图范围 bean 的属性,则会发生这种情况。这被称为问题 1492,已在(即将发布的)Mojarra 2.2 中修复。
通常,您可以通过缺少该rendered
属性来识别标记处理程序。例如<c:if>
, <f:validator>
,<ui:include>
等。如果您将此类标记处理程序的属性绑定到视图范围 bean 的属性,如下所示
<c:if test="#{viewScopedBean.something}"></c:if>
<h:inputText><f:validator binding="#{viewScopedBean.validate}" /></h:inputText>
<ui:include src="#{viewScopedBean.includePage}" />
然后每次从部分保存的状态恢复视图时,都会重新创建视图范围的 bean。这是视图范围的鸡蛋问题,因为为了获得正确的视图范围 bean,必须从恢复的视图中提取它。
binding
如果您在JSF 组件的属性中引用视图范围 bean 的属性,也会发生这种情况。
<h:someComponent binding="#{viewScopedBean.someComponent}" />