Моя проблема в том, что один из моих компонентов ViewScoped
создается несколько раз в одном и том же виде. Конструктор ViewScopedBean
создается каждый раз, когда я выбираю узел в дереве.
<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 xxx.bean.ViewScopedBean@4e1d2b8e
2 клика по дереву:
Constructor of ViewScopedBean xxx.bean.ViewScopedBean@4eb64f2e
Constructor of ViewScopedBean xxx.bean.ViewScopedBean@66863941
Затем я открываю окно отладки <ui:debug/>
, viewScopedBean
устанавливается на xxx.bean.ViewScopedBean@4e1d2b8e