在primefaces数据表中选择行时重新加载列表

在primefaces数据表中选择行时重新加载列表,primefaces,datatable,Primefaces,Datatable,我正在做一个从mysql数据库检索数据列表的示例。这一切都很好。 问题发生在我加载页面时,数据恢复方法在页面第一次加载时运行两次。 当我从dataTable中选择一条记录时,从列表中检索数据的方法会根据所选记录执行多次。例如,如果我选择注册号4,它将运行4次,直到到达所选索引,以显示该记录的详细信息。 有什么想法吗?。如何解决方法运行一次? Primefaces 5.0.RC2+Spring4,JPA,注释 package com.maosdel.rgi.web.controllers; im

我正在做一个从mysql数据库检索数据列表的示例。这一切都很好。 问题发生在我加载页面时,数据恢复方法在页面第一次加载时运行两次。 当我从dataTable中选择一条记录时,从列表中检索数据的方法会根据所选记录执行多次。例如,如果我选择注册号4,它将运行4次,直到到达所选索引,以显示该记录的详细信息。 有什么想法吗?。如何解决方法运行一次? Primefaces 5.0.RC2+Spring4,JPA,注释

package com.maosdel.rgi.web.controllers;

import java.io.Serializable;
import java.util.List;

import javax.faces.bean.SessionScoped;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import com.maosdel.rgi.dto.OperatorDTO;
import com.maosdel.rgi.model.exception.RgiBusinessException;
import com.maosdel.rgi.model.services.OperatorService;

@SessionScoped
@Component("operatorBean")
public class OperatorBean implements Serializable {

static final Logger logger = LoggerFactory.getLogger(OperatorBean.class);

private static final long serialVersionUID = -491242034992898914L;

@Autowired(required = true)
private OperatorService operatorService;

private OperatorDTO operatorSelected;
private List<OperatorDTO> operatorList;

public OperatorBean() {
    logger.info("OperatorBean instantiated...");
}

private List<OperatorDTO> loadAllOperators() {
    List<OperatorDTO> result = null;
    try {
        result = (List<OperatorDTO>) operatorService.getAllOperatorsHQL();
    } catch (RgiBusinessException e) {
        logger.error("Error recuperando registros... " + e);
    }
    return result;
}

public List<OperatorDTO> getOperatorList() {
    operatorList = loadAllOperators(); 
    return operatorList;
}

public OperatorDTO getOperatorSelected() {
    try {
        if (null != operatorSelected) {
            operatorSelected = operatorService.getOperatorById(operatorSelected.getId());
        }

    } catch (RgiBusinessException e) {
        logger.error("Error recuperando operador con Id: " + 2 + " Error: "
                + e);
    }
    return operatorSelected;
}

public void setOperatorSelected(OperatorDTO operatorSelected) {
    this.operatorSelected = operatorSelected;
}

}
xhtml页面

<ui:composition template="/WEB-INF/templates/defaultTemplate.xhtml">
<ui:define name="content">
    <h:form id="operatorFrm">
        <p:growl id="msgs" showDetail="true" />

        <p:dataTable var="operator" value="#{operatorBean.operatorList}"
            paginator="true" rows="10" rowKey="#{operator.id}"
            selectionMode="single">

            <f:facet name="header">
                Operadores
            </f:facet>

            <p:column headerText="Id">
                <h:outputText value="#{operator.id}" />
            </p:column>

            <p:column headerText="Code">
                <h:outputText value="#{operator.code}" />
            </p:column>

            <p:column headerText="Name">
                <h:outputText value="#{operator.name}" />
            </p:column>

            <p:column headerText="Last name">
                <h:outputText value="#{operator.lastName}" />
            </p:column>

            <p:column headerText="Data contract">
                <h:outputText value="#{operator.contractDate}" />
            </p:column>

            <p:column headerText="State">
                <h:outputText value="#{operator.state}" />
            </p:column>

            <p:column style="width:32px;text-align: center">
                <p:commandButton update=":operatorFrm:operatorDetail"
                    oncomplete="PF('operatorDlg').show()" icon="ui-icon-search"
                    title="View">
                    <f:setPropertyActionListener value="#{operator}"
                        target="#{operatorBean.operatorSelected}" />
                </p:commandButton>
            </p:column>
        </p:dataTable>


        <p:dialog header="Operator Info" widgetVar="operatorDlg" modal="true"
            showEffect="fade" hideEffect="fade" resizable="false">

            <p:outputPanel id="operatorDetail" style="text-align:center;">
                <p:panelGrid columns="2"
                    rendered="#{not empty operatorBean.operatorSelected}"
                    columnClasses="label,value">

                    <f:facet name="header">
                    </f:facet>

                    <h:outputText value="Id:" />
                    <h:outputText value="#{operatorBean.operatorSelected.id}" />

                    <h:outputText value="Code" />
                    <h:outputText value="#{operatorBean.operatorSelected.code}" />

                    <h:outputText value="Name" />
                    <h:outputText value="#{operatorBean.operatorSelected.name}" />

                    <h:outputText value="Last name" />
                    <h:outputText value="#{operatorBean.operatorSelected.lastName}" />

                    <h:outputText value="Data contract" />
                    <h:outputText value="#{operatorBean.operatorSelected.contractDate}" />

                    <h:outputText value="State" />
                    <h:outputText value="#{operatorBean.operatorSelected.state}" />

                </p:panelGrid>
            </p:outputPanel>
        </p:dialog>
    </h:form>
</ui:define>

您不必使用服务方法手动执行查找,datatable将为您处理该问题。

您忘记了选择标记

selection="#{operatorBean.operatorSelected}"
你能试试下面的代码吗

<p:dataTable var="operator" value="#{operatorBean.operatorList}"
        paginator="true" rows="10" rowKey="#{operator.id}"
        selectionMode="single" selection="#{operatorBean.operatorSelected}">

谢谢你,Emil,我已经创建了一个带有PostConstruct注释的init方法,效果很好。但是,当我选择一行来查看其详细信息,并且getOperatorSelected方法多次运行时,会出现一个问题。
public OperatorDTO getOperatorSelected() {
    return operatorSelected;
}
selection="#{operatorBean.operatorSelected}"
<p:dataTable var="operator" value="#{operatorBean.operatorList}"
        paginator="true" rows="10" rowKey="#{operator.id}"
        selectionMode="single" selection="#{operatorBean.operatorSelected}">