My problem is that one of my ViewScoped
bean is created several time within the same view. The constructor of ViewScopedBean
is created every time I select a node in the tree.
<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>
If I remove this part (reference to a composite component), the constructor of ViewScopedBean
is not called:
<p:outputPanel id="panel"> <ag:profileComponent managedBean="#{viewScopedBean.profileBean}"/> </p:outputPanel>
All the beans used are set as @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(); } }
Is it the correct behaviour? If not what can cause it?
Update: I tried to use an empty composite, and I have the same problem.
<?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>
But if I made the managedBean
not required, that's fine.
Another thing I don't get is when the constructor is called, it seems that the object created is not used.
Initiating the view (console output):
Constructor of ViewScopedBean xxx.bean.ViewScopedBean@4e1d2b8e
2 clicks on the tree:
Constructor of ViewScopedBean xxx.bean.ViewScopedBean@4eb64f2e Constructor of ViewScopedBean xxx.bean.ViewScopedBean@66863941
Then I open the debug window <ui:debug/>
, the viewScopedBean
is set to xxx.bean.ViewScopedBean@4e1d2b8e