我有一个共同的任务,就是选择一个或多个“LocalizacaoTO”'在页面上做任何其他事情之前。
目前,数据检索/进程/ ajax事件等的逻辑在名为" SeletorLocalizacaoMB"的ViewScoped
bean上维护。我想在同一页面上使用同一个bean的多个实例。
首先我使用复合组件,但是当我选择一个节点时,它存储在页面上的最后一个bean上。
如果我在TesteSeletorMB上声明了3个实例:
@Named
@ViewScoped
public class TesteSeletorMB implements Serializable {
@Inject
@Getter @Setter
private SeletorLocalizacaoMB instanceOne;
@Inject
@Getter @Setter
private SeletorLocalizacaoMB instanceTwo;
@Inject
@Getter @Setter
private SeletorLocalizacaoMB instanceThree;
}
无论我使用的页面上的哪个组件,instanceThree始终保存值。
基于一些研究,我了解复合材料组件不是解决此问题的理想方案。
所以我更改了UI实现,并使用Facelets创建了一个'模板'名为seletor.xhtml。
<ui:composition xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:c="http://java.sun.com/jsp/jstl/core"
xmlns:p="http://primefaces.org/ui"
xmlns:o="http://omnifaces.org/ui">
<p:dialog header="Busca Hierarquica"
id="#{id}ModalTree"
widgetVar="dlgSelecaoHierarquica"
showEffect="fade"
hideEffect="fade"
closeOnEscape="true"
modal="#{bloqueiaModal}"
height="400px"
width="500px">
<h:panelGrid columns="2">
<p:commandButton id="#{id}btnSelecao"
value="Selecionar e Voltar"
action="#{mb['selecionarLocalHierarquico']}"
update="@(.#{id}-auto-complete)"
oncomplete="bloqueiaAutoMulti();"/>
<p:commandButton value="Voltar"
type="button"
onclick="PF('dlgSelecaoHierarquica').hide();" />
</h:panelGrid>
<p:scrollPanel style="width:100%;height:350;" mode="native">
<p:tree id="#{id}Tree"
style="width:100%;height:100%;"
styleClass="estilo-arvore"
value="#{mb.arvoreHierarquica}"
var="local"
selectionMode="multiple"
dynamic="true"
animate="true">
<p:ajax event="select" listener="#{mb['onNodeSelect']}" update="@this"/>
<p:treeNode >
<h:outputText value="#{local.cdClasseLocal}: #{local.cdLocalizacao} #{local.niveis}" />
</p:treeNode>
</p:tree>
</p:scrollPanel>
</p:dialog>
</ui:composition>
使用<ui:include>
<f:subview id="seletorAlpha">
<ui:include src="/template/seletor.xhtml">
<ui:param name="mb" value="#{testeSeletorMB.seletorAlpha}" />
<ui:param name="id" value="alpha" />
</ui:include>
</f:subview>
<f:subview id="seletorBravo">
<ui:include src="/template/seletor.xhtml">
<ui:param name="mb" value="#{testeSeletorMB.seletorBravo}" />
<ui:param name="id" value="bravo" />
</ui:include>
</f:subview>
持有多个实例的测试Bean:
import javax.inject.Named;
import org.omnifaces.cdi.ViewScoped;
@Named
@ViewScoped
public class TesteSeletorMB implements Serializable {
@Inject
@Getter @Setter
private SeletorLocalizacaoMB seletorAlpha;
@Inject
@Getter @Setter
private SeletorLocalizacaoMB seletorBravo;
}
用于&#39; seletor.xhtml&#39;
的CDI Beanimport javax.inject.Named;
import org.omnifaces.cdi.ViewScoped;
@Named
@ViewScoped
public class SeletorLocalizacaoMB implements Serializable {
private List<LocalizacaoTO> locaisHierarquicosSelecionados;
private TreeNode arvoreHierarquica;
//PostConstruct, Ajax events and things :)
}
在我的例子中,我希望TesteSeletorMB变量(seletorAlpha和seletorBravo)在其列表中保存不同的值。可能吗?
我尝试将SeletorLocalizacaoMB范围更改为@Dependent
,但它既没有工作也没有。这是事情混乱的地方。阅读CDI API,第一个州说:
使用范围@Dependent声明的Bean对具有其他&gt;内置范围类型的bean的行为有所不同。当声明bean具有范围@Dependent:
时在多次注入&gt;点之间没有共享注入的bean实例。
它不应该持有相同的实例,对吧?!
环境
如有必要,我可以提供其他数据。我没有粘贴所有的SeletorLocalizacaoMB&#39;代码,因为它有很多依赖项,我觉得问题与类处理操作的方式无关。