我的問題是我的ViewScoped
bean之一是在同一視圖中多次創建的。每次我在樹中選擇一個節點時,都會創建ViewScopedBean
的構造函數。JSF 2.0 ViewScoped生命週期
<h:form>
<p:tree value="#{treeBean.root}" var="node"
selectionMode="single" selection="#{viewScopedBean.selectedNode}">
<p:ajax event="select" update="selectedNode, treeBeanUpdate, otherBeanUpdate, panel" listener="#{treeBean.onNodeSelect}" />
<p:treeNode>
<h:outputText value="#{node}" />
</p:treeNode>
</p:tree>
Selected Node: <h:outputText value="#{viewScopedBean.selectedNode}" id="selectedNode"/><br/>
Current TreeBean: <h:outputText value="#{treeBean}" id="treeBeanUpdate"/><br/>
Current OtherBean: <h:outputText value="#{viewScopedBean}" id="otherBeanUpdate"/><br/>
<p:outputPanel id="panel">
<ag:profileComponent managedBean="#{viewScopedBean.profileBean}"/>
</p:outputPanel>
</h:form>
如果刪除該部分(參照複合部件)中,ViewScopedBean
構造不調用:
<p:outputPanel id="panel">
<ag:profileComponent managedBean="#{viewScopedBean.profileBean}"/>
</p:outputPanel>
所用的所有豆被設定爲@ViewScoped
。
@ManagedBean
@ViewScoped
public class ViewScopedBean implements Serializable {
private TreeNode selectedNode;
private ProfileBean profileBean;
public ViewScopedBean() {
System.out.println("Constructor of ViewScopedBean " + this);
}
@PostConstruct
public void init() {
System.out.println("ViewScoped init" + this);
profileBean = new ProfileBean();
}
}
這是正確的行爲嗎?如果不是什麼可能導致它?
更新:我試圖使用一個空的複合,我有同樣的問題。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:composite="http://java.sun.com/jsf/composite">
<composite:interface>
<composite:attribute name="managedBean" required="true"/>
</composite:interface>
<composite:implementation>
</composite:implementation>
</html>
但是,如果我使managedBean
不需要,那很好。
我不明白的另一件事是調用構造函數時,似乎創建的對象不被使用。
發起所述視圖(控制檯輸出):
Constructor of ViewScopedBean [email protected]
2次點擊的樹:
Constructor of ViewScopedBean [email protected]
Constructor of ViewScopedBean [email protected]
然後我打開調試窗口<ui:debug/>
,所述viewScopedBean
設置爲[email protected]
嗯。這非常有趣。你可以嘗試在第二個(或第三個)實例化時拋出異常嗎?很高興看到堆棧跟蹤並看到WHO正在創建ViewScopedBean以及在哪裏。 – fdreger
如果我禁用了部分狀態保存,構造函數實際上只調用一次。 – Sydney
[這個答案](https://stackoverflow.com/questions/15265433/how-and-when-is-a-view-scope-bean-destroyed-in-jsf/15391453#15391453)的問題*「如何何時在JSF中銷燬視圖範圍bean?「*可能是相關的。 – Lii