Como setar o BEAN no selection do datatable - PRIMEFACES

Boa tarde, galera

Estou usando o primefaces 2.2.1 num projeto aqui, e não estou tendo sucesso em algo básico do primefaces, o selection do p:datatable.
O que deve acontecer é muito simples: selecionar uma linha do datatable e carregar os valores num form ao lado via ajax (não estou usando o p:dialog).
O que acontece: ao clicar na linha o setter é chamado, mas meu rowSelectListener nunca e verifiquei q o objeto está sempre nulo.
Tenho algumas duvidas como isso realmente funciona, não é preciso um converter para funcionar, é realmente necessário o Listener?
Usava o JSF 1.2 e lembro q la tinha um converter para isso, mas com o JSF 2.0 e o primefaces não sei se existe, estou meio perdido.

Espero q tenha sido claro quanto a duvida. Alguém sabe o q fiz ou está errado?

Abaixo meu datatable e manageBean

<p:dataTable paginator="true" rows="10" widgetVar="tabelaClientes" 
			lazy="true" dynamic="true" selectionMode="single" id="tabela"
			value="#{clienteDM}" var="cliente" onRowSelectUpdate="form" rowSelectListener="#{clienteMB.onRowSelect}"
			paginatorTemplate=" {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}"  
	                rowsPerPageTemplate="10,15,20" selection="#{clienteMB.cliente}"
			loadingMessage="Carregando..." paginatorPosition="bottom" >
				 
				 <p:column sortBy="#{cliente.id}" filterBy="#{cliente.id}" filterEvent="enter" >
				 	<f:facet name="header">Id</f:facet>
				 	<h:outputText value="#{cliente.id}" />
				 </p:column>
				 
				 <p:column filterBy="#{cliente.nome}" sortBy="#{cliente.nome}" >
				 	<f:facet name="header">Nome</f:facet>
				 	<h:outputText value="#{cliente.nome}" />
				 </p:column>
			</p:dataTable>

o form q deverá sofrer o update quando selecionar a linha

<h:panelGrid id="form" style="width:100%" >
			<h:panelGroup>
			<div class="form-topo">
				<div><p:commandLink value="+ Novo cliente" action="#{clienteMB.reset}" update="form" /></div>
				<div class="clear"></div>
			</div>
			<div>
				<div>Nome</div>
				<h:inputText value="#{clienteMB.cliente.nome}" />
			</div>
			<div>
				<p:commandButton styleClass="bt"  value="Salvar" action="#{clienteMB.salvar}" update="tabela"  />
			</div>
			</h:panelGroup>
		</h:panelGrid>

ManageBean

@Component("clienteMB")
@SessionScoped
public class ClienteMB {
	.
	.
	.
	private ClienteVO cliente;
	
	
	public void setCliente(ClienteVO cliente) {
		this.cliente = cliente;
	}
	
	public ClienteVO getCliente() {
	 	if(cliente == null){
	 		cliente = new ClienteVO();
	 	}
		return cliente;
	}
	
	public void onRowSelect(SelectEvent event){
		cliente = (ClienteVO) event.getObject();
	}
	
}

Não me lembro qual a ordem dos eventos, mas, use o <f:setPropertyActionListener> para passar a linha selecionada, para a referencia do bean no seu ManagedBean, algo +/- como (eu uso assim no modo não ajax, agora é só você adaptar):

<h:commandLink value="#{msg['edit']}" action="#{usuarioController.edit}">
	<f:setPropertyActionListener value="#{usuario}" target="#{usuarioController.bean}" />
</h:commandLink>

o p:datatable faz isso automático, basta preencher o atributo selection da tag com o atributo do ManagedBean

exemplo:

<p:dataTable var="car" value="#{tableBean.carsSmall}"  
                 selection="#{tableBean.selectedCar}" selectionMode="single"> 

...(colunas)...
</p:dataTable>

Veja o exemplo no site do primefaces http://www.primefaces.org/showcase/ui/datatableRowSelectionSingle.jsf
neste ele abre um p:dialog apenas para exibição, mas vc pode adapta-lo para edição.

É exatamente meu problema jokacwb, quando faço a seleção o objeto selecionado está nulo. Segui o exemplo do site do Primefaces, mas não funcionou mesmo assim. O exemplo do Listener também vi no site deles, e nada.

Olha eu não sei se tem alguma coisa relacionada com a versão, mas estou testando a versão 3
usando este exemplo http://www.primefaces.org/showcase-labs/ui/datatableRowSelectionByColumn.jsf
e ta funcionando.
Acho q mesmo na versar 2xx q vc esta usando da para implementar esse exemplo, nele o autor usa uma coluna
do datatable para acomodar os controles (Exibir/Alterar/Excluir) e em cada botão ele usa o f:setPropertyActionListener
para atualizar o objeto que vai ser editado/exibido/excluido inclusive em outra variavel ele controla se o dialogo
vai ser aberto para edição ou não.

Bom dia!

desenhotorix, conseguiu resolver?

Eu consegui resolver esse problema do selection colocando um <p:ajax listener="#{meuBean.eventoSelect}" /> dentro do data table no lugar de rowSelectListener="#{clienteMB.onRowSelect}" , e criei método eventoSelect no bean:

    public void eventoSelect(SelectEvent evt)
    {
        this.atributoSelecionado = (Atributo) evt.getObject();
    }

Mas eu gostaria mesmo é de fazer como jokacwb disse, colocar uma coluna para tratar os eventos (Exibir/Alterar/Excluir). Mas os exemplos do ShowCase são muito ruins, estão sempre desatualizados e nunca consigo fazer funcionar aqui de primeira, só após muitas horas de tentativas e pesquisas em forums!

Se alguém tiver algum exemplo dessa coluna para tratar eventos, agradeço!

Até +!

1 curtida