Erro ao selecionar registro de uma DataTable PrimeFaces

2 respostas
rondinelysoares

Boa tarde a todos estou com problema ao selecionar um registro de uma dataTable, debugando o fonte vi que no “selection” o objeto que será alvo desse evento recebe sempre null e não o objeto selecionado segue os fontes:
View

<ui:composition template="WEB-INF/templates/template.xhtml"
xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
xmlns:h="http://xmlns.jcp.org/jsf/html"
xmlns:f="http://xmlns.jcp.org/jsf/core"
xmlns:p=“http://primefaces.org/ui”>

<ui:define name="corpo">

    <div class="ui-fluid">
        <h:form id="formulario">

            <p:growl autoUpdate="true" escape="true" />

            <p:toolbar id="barra">

                <f:facet name="left">
                    <p:commandButton title="Incluir novo cliente"
                        oncomplete="PF('dialogo').show();" process="@this"
                        update="dialogo" icon="ui-icon-document" style="width: 50px;"
                        action="#{clienteBean.prepararNovoCliente}">

                    </p:commandButton>
                    <p:commandButton icon="ui-icon-pencil" process="@this"
                        update="dialogo" oncomplete="PF('dialogo').show()"
                        style="width: 50px;"
                        >
                        
                        <p:resetInput target="dialogo"/>
                        
                        <f:setPropertyActionListener value="#{clienteBean.clienteSelecionado}" target="#{clienteBean.clienteEdicao}"/>
                                                            
                    </p:commandButton>

                </f:facet>
                
                <f:facet name="right">
                
                   <h:form>
                      <h:panelGrid columns="2">
                         <p:inputText size="50"/>
                         <p:commandButton icon="ui-icon-search" style="width: 50px"/>
                      </h:panelGrid>                                                    
                   </h:form>
                 
                </f:facet>

            </p:toolbar>

            <p:dataTable emptyMessage="Nenhum Cliente Cadastrado" reflow="true"
                styleClass="ui-fluid" value="#{clienteBean.clientes}" var="cliente"
                selectionMode="single" id="dbgrid" paginator="true" 
                selection="#{clienteBean.clienteSelecionado}"
                rowKey="#{cliente.id}" paginatorPosition="bottom" rows="10"
                >
                
                <f:ajax event="rowSelect"/>

                <p:column headerText="Nome" styleClass="ui-grid-col-8"
                    style="width: 80%; text-align: left;">
                    <p:outputLabel value="#{cliente.nome}" />
                </p:column>

                <p:column headerText="CPF" styleClass="ui-grid-col-4"
                    style="width: 20%; text-align: center;">
                    <p:outputLabel value="#{cliente.cpf}" />
                </p:column>

            </p:dataTable>

            <p:dialog widgetVar="dialogo" id="dialogo" resizable="false"
                header="Cadastro de Clientes" responsive="true"  
                closeOnEscape="true">

                <p:messages autoUpdate="true" closable="true" />

                <p:panelGrid columns="2" style="margin-top: 10px;" layout="grid"
                    styleClass="ui-panelgrid-blank"
                    columnClasses="ui-grid-col-4, ui-grid-col-8 ">


                    <p:outputLabel value="Nome" for="txtNome" />
                    <p:inputText id="txtNome"
                        value="#{clienteBean.clienteEdicao.nome}" />

                    <p:outputLabel value="Endereco" for="txtEndereco" />
                    <p:inputText id="txtEndereco"
                        value="#{clienteBean.clienteEdicao.endereco}" />

                    <p:outputLabel value="Bairro" for="txtBairro" />
                    <p:inputText id="txtBairro"
                        value="#{clienteBean.clienteEdicao.bairro}" />

                    <p:outputLabel value="Numero" for="txtNumero" />
                    <p:inputText id="txtNumero"
                        value="#{clienteBean.clienteEdicao.numero}" />

                    <p:outputLabel value="Cep" for="txtCep" />
                    <p:inputMask id="txtCep" mask="99.999-999"
                        value="#{clienteBean.clienteEdicao.cep}" />

                    <p:outputLabel value="CPF" for="txtCPF" />
                    <p:inputMask id="txtCPF" mask="[CPF removido]"
                        title="Este campo devera ser informado"
                        value="#{clienteBean.clienteEdicao.cpf}" />

                    <p:outputLabel value="Data de Nascimento" for="txtDatNasc" />
                    <p:calendar id="txtDatNasc" pattern="dd/MM/yyyy"
                        value="#{clienteBean.clienteEdicao.dt_nasc}" />


                    <p:commandButton value="Salvar" icon="ui-icon-disk"
                        action="#{clienteBean.salvarCliente}" process="@form"
                        update="formulario"
                        oncomplete="if (!args.validationFailed) PF('dialogo').hide()" />
                    <p:outputLabel />

                </p:panelGrid>


            </p:dialog>

        </h:form>
    </div>

</ui:define>

</ui:composition>

meu Bean
package br.com.tiautomacao.bean;

import java.util.List;

import javax.annotation.PostConstruct;

import javax.faces.application.FacesMessage;

import javax.faces.bean.ManagedBean;

import javax.faces.bean.ViewScoped;

import javax.faces.context.FacesContext;

import org.primefaces.event.SelectEvent;

import br.com.tiautomacao.cadastros.Cliente;
import br.com.tiautomacao.dao.ClienteDao;

@ManagedBean(name = clienteBean)

@ViewScoped

public class ClienteBean {
private List<Cliente> clientes;
private Cliente clienteEdicao = new Cliente();
private Cliente clienteSelecionado = new Cliente();

public void prepararNovoCliente() {
    clienteEdicao = new Cliente();
}

public void setClienteEdicao(Cliente clienteEdicao) {

    this.clienteEdicao = clienteEdicao;

}

public Cliente getClienteEdicao() {
    return clienteEdicao;
}

public void novoCliente() {
    clienteEdicao = new Cliente();
}

@PostConstruct
private void init() {
    System.out.println("Init");
    buscarTodos();

}

public void salvarCliente() {

    ClienteDao c = new ClienteDao();
    c.insert(clienteEdicao);

    FacesContext contexto = FacesContext.getCurrentInstance();
    FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Dados salvos com sucesso",
            "Dados salvos com sucesso");
    contexto.addMessage(null, msg);
    buscarTodos();

}

public List<Cliente> getClientes() {
    return clientes;
}

private void buscarTodos() {
    ClienteDao c = new ClienteDao();
    clientes = c.getAll();
}

public Cliente getClienteSelecionado() {
    return clienteSelecionado;
}

public void setClienteSelecionado(Cliente clienteSelecionado) {
    
    if (clienteSelecionado == null){
        System.out.println("Cliente selecionado = null ");
    }else{
        System.out.println("Setando cliente "+clienteSelecionado.getNome());    
    }
    
    this.clienteSelecionado = clienteSelecionado;

}

public void onRowSelect(SelectEvent evt){
    System.out.println("Cliente Selecionado evento "+evt.getObject().toString());
}

}

Só lembrando que eu não uso Bean CDI.

Agradeço a todos que puderem ajudar.

2 Respostas

lucciano01

`
tenta isso:

private DataModel< Cliente> dataModelClientes;

@PostConstruct

private void init() {

dataModelClientes = new ListDataModel<>(buscarTodos( ));
public Cliente getClienteSelecionado() {

return (Cliente) dataModelClientes.getRowData( );

}

`

rondinelysoares

Fiz o teste aqui da forma que você passou e funcionou certinho.
Obrigado Luciano

Criado 5 de março de 2016
Ultima resposta 7 de mar. de 2016
Respostas 2
Participantes 2