在facelets模板上重用JSF2 View Scoped Bean

时间:2015-04-01 13:34:29

标签: jsf-2 cdi facelets backing-beans

我有一个共同的任务,就是选择一个或多个“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 Bean
import 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实例。

它不应该持有相同的实例,对吧?!


环境

  • WebSphere Application Server 8.5.5.2
  • Apache MyFaces 2.0.2
  • PrimeFaces 5.0
  • OmniFaces 1.7

如有必要,我可以提供其他数据。我没有粘贴所有的SeletorLocalizacaoMB&#39;代码,因为它有很多依赖项,我觉得问题与类处理操作的方式无关。

0 个答案:

没有答案