Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jsf 2 在facelets模板上重用JSF2视图范围Bean_Jsf 2_Cdi_Facelets_Backing Beans - Fatal编程技术网

Jsf 2 在facelets模板上重用JSF2视图范围Bean

Jsf 2 在facelets模板上重用JSF2视图范围Bean,jsf-2,cdi,facelets,backing-beans,Jsf 2,Cdi,Facelets,Backing Beans,我有一个共同的任务,选择一个或多个“LocalizaoTo”,然后再在页面上执行任何其他操作 目前,数据检索/处理/ajax事件等的逻辑都是在一个名为“SeletorLocalizaoMB”的ViewScopedbean上维护的,我希望在同一页面上使用同一bean的多个实例 首先,我使用复合组件,但当我选择一个节点时,它存储在页面的最后一个bean中 如果我在TesteSeletorMB上声明了3个实例: @Named @ViewScoped public class TesteSeletorM

我有一个共同的任务,选择一个或多个“LocalizaoTo”,然后再在页面上执行任何其他操作

目前,数据检索/处理/ajax事件等的逻辑都是在一个名为“SeletorLocalizaoMB”的
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>
“seletor.xhtml”上使用的CDIBean

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 :)
    
}
import javax.inject.Named;
导入org.omnifaces.cdi.ViewScoped;
@命名
@视域
公共类SeletorLocalizaoMB实现可序列化{
私人名单地方等级;
私人特列诺德·阿沃雷赫拉基卡;
//后期构造、Ajax事件和其他内容:)
}

在我的示例中,我希望TesteSeletorMB变量(seletorAlpha和seletorBravo)在其列表中包含不同的值。可能吗

我试图将SeletorLocalizaoMB的作用域更改为
@Dependent
,但它也不起作用。这就是事情变得混乱的地方。在阅读中,第一个州说:

使用scope@Dependent声明的bean的行为与使用其他>内置范围类型的bean不同。当一个bean被声明为具有scope@Dependent时:

在多个injection>点之间从未共享bean的注入实例

它不应该持有相同的实例,对吗


环境

  • WebSphere Application Server 8.5.5.2
  • ApacheMyFaces2.0.2
  • PrimeFaces 5.0
  • OmniFaces 1.7
如有必要,我可以提供额外的数据。我没有粘贴所有的“SeletorLocalizaoMB”代码,因为它有许多依赖项,我感觉问题与类处理操作的方式无关

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;
}
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 :)
    
}