[RESOLVIDO] componente dialog não recebe objeto - JSF + Priefaces

Boa tarde galera,

Procurei em todo lugar mas sem sucesso.

Estou fazendo um Dialog para editar um usuario mas não esta dando certo. Passo o objeto com o f:setPropertyActionListene mas ele so traz um unico objeto para todos os usuarios.

ex: tenho 10 usuarios. clico na primeira linha e ele me traz o dialog carregado com as informações do usuario, se eu fechar o dialog e tentar carregar outro usuario ele me traz o primeiro usuario. Não esta mudando de objeto

Segue codigo da view, se alguem puder me falar aonde estou errando.

Obs: Quando eu edito um usuario usando uma pagina.xhtml o objeto e carregado e edita normalmente.


<?xml version="1.0" encoding="UTF-8"?>
<!--
To change this template, choose Tools | Templates
and open the template in the editor.
-->
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:p="http://primefaces.org/ui"
      xmlns:ui="http://java.sun.com/jsf/facelets">

    <ui:composition template="/templates/interna.xhtml">
        <ui:define name="titulo">Pesquisar Usuário</ui:define>
        <ui:define name="corpo">
            <p:panel id="centro" style="font-size: 13px;">
                <h:form id="listagemUsuario">
                    <p:dataTable id="listagem" var="usuario" value="#{pessoaBean.lista}" scrollable="true" scrollHeight="400">
                        <p:column headerText="Nome" style=" width: 40%">
                            #{usuario.nome}
                        </p:column>
                        
                        <p:column headerText="Login" style="width: 15%">
                            #{usuario.login}
                        </p:column>
                        
                        <p:column headerText="Permissão" style="text-align: center; width: 15%">
                            <h:graphicImage library="imagens" name="pessoa_#{usuario.permissao}.png"/> 
                        </p:column>
                        
                        <p:column headerText="Status" style="text-align: center; width: 5%">
                            <h:commandLink action="#{pessoaBean.ativar}" >
                                <h:graphicImage library="imagens" name="pessoa_#{usuario.ativo}.png" /> 
                                <f:setPropertyActionListener target="#{pessoaBean.pessoa}" value="#{usuario}" /> 
                            </h:commandLink>
                        </p:column>
                        
                        <!-- Aqui estou tentando editar por um dialog -->

                        <p:column headerText="Visualizar" style="text-align: center; width: 5%" >
                            <p:commandLink oncomplete="visualizarDialog.show()"  update="@form">
                                <h:graphicImage library="imagens" name="visualizar_dados.png" />
                                <f:setPropertyActionListener target="#{pessoaBean.pessoa}" value="#{usuario}" />
                            </p:commandLink>

                            <p:dialog id="visualizarDialog" header="Dados do Usuário" widgetVar="visualizarDialog" width="400" modal="true" resizable="false">
                                <h:panelGrid columns="2">
                                    <h:outputLabel value="Código: " />
                                    <h:outputLabel value="#{usuario.codigo}" />
                                    <h:outputLabel value="Nome: " />
                                    <h:inputText value="#{usuario.nome}" />
                                    <h:outputLabel value="Login: " />
                                    <h:inputText value="#{usuario.login}" />
                                    <h:outputLabel value="Status: " />
                                    <h:inputText value="#{usuario.ativo}" />
                                    <h:outputLabel value="Permissão: " />
                                    <h:inputText value="#{usuario.permissao}"/>
                                    <h:outputLabel value="Setor: " />
                                    <h:inputText value="#{usuario.setor}" />
                                    <h:outputLabel value="Cargo: " />
                                    <h:inputText value="#{usuario.cargo}" />
                                    <h:outputLabel value="Data Cadastro: " />
                                    <h:outputText value="#{usuario.dataCadastro}" />
                                </h:panelGrid>
                            </p:dialog>

                        </p:column>

                        <!--  Assim consigo editar o usuario, mas carregando o objeto em uma pagina xhtml. -->

                        <p:column headerText="Editar"  style="text-align: center; width: 10%">
                            <h:commandLink action="#{pessoaBean.editar}">
                                <h:graphicImage library="imagens" name="editar_pessoa.png" />
                                <f:setPropertyActionListener target="#{pessoaBean.pessoa}" value="#{usuario}" />
                                <f:setPropertyActionListener target="#{pessoaBean.paginaDestino}" value="/restrito/cadastro_usuario" />
                            </h:commandLink>
                        </p:column>
                        
                    </p:dataTable>
                </h:form>
            </p:panel>
        </ui:define>
    </ui:composition> 
</html>

Bean


@ManagedBean(name="pessoaBean")
@RequestScoped
public class PessoaBean {
      
    private Pessoa pessoa = new Pessoa();
    private List<Pessoa> lista;
    private String paginaDestino;
    
    public String salvar(){
        
        PessoaRN pessoaRN = new PessoaRN();
        this.pessoa.setDataCadastro(new Date());
        this.pessoa.setAtivo(true);
        pessoaRN.salvar(pessoa);
        
        return this.paginaDestino = "pesquisa_usuario?faces-redirect=true";
    }
    
    public String ativar(){
        if(this.pessoa.isAtivo())
            this.pessoa.setAtivo(false);  
        else
            this.pessoa.setAtivo(true);   
        PessoaRN pessoaRN = new PessoaRN();
        pessoaRN.salvar(this.pessoa);
        return null;
    }
    
    
    public Pessoa getVisualizar() {
        return visualizar;
    }

    public void setVisualizar(Pessoa visualizar) {
        this.visualizar = visualizar;
    }

    public List<Pessoa> getLista() {
        if(this.lista == null){
            PessoaRN pessoaRN = new PessoaRN();
            this.lista = pessoaRN.listar();
        }
        return lista;
    }

    public void setLista(List<Pessoa> lista) {
        this.lista = lista;
    }
    
    public Pessoa getPessoa() {
        return pessoa;
    }

    public void setPessoa(Pessoa pessoa) {
        this.pessoa = pessoa;
    }

    public String getPaginaDestino() {
        return paginaDestino;
    }

    public void setPaginaDestino(String paginaDestino) {
        this.paginaDestino = paginaDestino;
    }
    
}

Vc deve referenciar seu objeto a partir do seu Bean.

<h:panelGrid columns="2"> <h:outputLabel value="Código: " /> <h:outputLabel value="#{pessoaBean.pessoa.codigo}" /> <h:outputLabel value="Nome: " /> <h:inputText value="#{pessoaBean.pessoa.nome}" /> // segue seu codigo... </h:panelGrid>

Cara,

Substitui o trecho de código que vc atualiza o form para atualizar o dialog.

<p:commandLink oncomplete="visualizarDialog.show()" update="@form"> <h:graphicImage library="imagens" name="visualizar_dados.png" /> <f:setPropertyActionListener target="#{pessoaBean.pessoa}" value="#{usuario}" /> </p:commandLink>

para

<p:commandLink oncomplete="visualizarDialog.show()" update="visualizarDialog"> <h:graphicImage library="imagens" name="visualizar_dados.png" /> <f:setPropertyActionListener target="#{pessoaBean.pessoa}" value="#{usuario}" /> </p:commandLink>

Fiz uma POC tentanto estar o mais proximo possivel do seu código.

[code]public class Pessoa {

private String nome;
private String login;

public String getNome() {
	return nome;
}
public void setNome(String nome) {
	this.nome = nome;
}
public String getLogin() {
	return login;
}
public void setLogin(String login) {
	this.login = login;
}	

}[/code]

[code]
@ManagedBean(name=“pessoaBean”)
@RequestScoped
public class PessoaBean {

private Pessoa pessoa;
private List<Pessoa> lista;

public PessoaBean(){
	lista = new ArrayList<Pessoa>();
	criarDadosFake();
}

private void criarDadosFake(){
	Pessoa p = new Pessoa();
	for (int i = 0; i < 10; i++) {
		p.setLogin("login"+i);
		p.setNome("nome"+i);
		
		lista.add(p);
		p = new Pessoa();			
	}
	
}

public List<Pessoa> getLista() {
	return lista;
}

public void setLista(List<Pessoa> lista) {
	this.lista = lista;
}

public Pessoa getPessoa() {
	return pessoa;
}

public void setPessoa(Pessoa pessoa) {
	this.pessoa = pessoa;
}

}[/code]

[code]

<h:head>
Pessoa
</h:head>
<h:body>
<h:form id=“listagemUsuario”>
<p:dataTable id=“listagem” var=“usuario” value="#{pessoaBean.lista}" scrollable=“true” scrollHeight=“400”>
<p:column headerText=“Nome” style=" width: 40%">#{usuario.nome}</p:column>
<p:column headerText=“Login” style=“width: 15%”>#{usuario.login}</p:column>

		<p:column headerText="Visualizar" style="text-align: center; width: 5%">
			<p:commandLink oncomplete="visualizarDialog.show()"  update="visualizarDialog">
				<h:outputLabel value="link" /> 
                <f:setPropertyActionListener target="#{pessoaBean.pessoa}" value="#{usuario}" />  
             </p:commandLink>
             
             <p:dialog id="visualizarDialog" header="Dados do Usuário" widgetVar="visualizarDialog" width="400" modal="true" resizable="false">  
                  <h:panelGrid columns="2">  
                      <h:outputLabel value="Nome: "/>  
                      <h:inputText value="#{usuario.nome}"/>  
                      <h:outputLabel value="Login: "/>  
                      <h:inputText value="#{usuario.login}"/>
                  </h:panelGrid>  
              </p:dialog>
              
		</p:column> 
	</p:dataTable>
	
</h:form>

</h:body>

[/code]

Espero que tenha te ajudado…

Segue uma forma mais elegante de se aplicar a seleção em tabelas usando PrimeFaces.

Pojo:

[code]public class Pessoa {

private String nome;
private String login;

public String getNome() {
	return nome;
}
public void setNome(String nome) {
	this.nome = nome;
}
public String getLogin() {
	return login;
}
public void setLogin(String login) {
	this.login = login;
}	

}[/code]

DataModel:

[code]public class PessoaDataModel extends ListDataModel implements SelectableDataModel{

public PessoaDataModel(){}

public PessoaDataModel(List<Pessoa> data){
	super(data);
}

@Override
public Pessoa getRowData(String rowKey) {
	List<Pessoa> pessoas = (List<Pessoa>) getWrappedData();
	for (Pessoa pessoa : pessoas) {
		String key = pessoa.getLogin() + pessoa.getNome();
		if(key.equals(rowKey)){
			return pessoa;				
		}
	}
	return null;
}

@Override
public Object getRowKey(Pessoa pessoa) {		
	return (pessoa.getLogin()+pessoa.getNome());
}

}[/code]

Bean:

[code]
@ManagedBean(name=“pessoaBean”)
@SessionScoped
public class PessoaBean {

private Pessoa pessoa;
private List<Pessoa> lista;
private PessoaDataModel dataModel;

public PessoaBean(){
	lista = new ArrayList<Pessoa>();		
	criarDadosFake();
	
	dataModel = new PessoaDataModel(lista);
}

private void criarDadosFake(){
	Pessoa p = new Pessoa();
	for (int i = 0; i < 10; i++) {
		p.setLogin("login"+i);
		p.setNome("nome"+i);
		
		lista.add(p);
		p = new Pessoa();			
	}		
}

public void aoSelecionar(SelectEvent event) {  
    FacesMessage msg = new FacesMessage("Car Selected", ((Pessoa) event.getObject()).getNome());
    FacesContext.getCurrentInstance().addMessage(null, msg);  
}  

public List<Pessoa> getLista() {
	return lista;
}

public void setLista(List<Pessoa> lista) {
	this.lista = lista;
}

public Pessoa getPessoa() {
	return pessoa;
}

public void setPessoa(Pessoa pessoa) {
	this.pessoa = pessoa;
}

public PessoaDataModel getDataModel() {
	return dataModel;
}

public void setDataModel(PessoaDataModel dataModel) {
	this.dataModel = dataModel;
}

}[/code]

XHTML:

[code]

<h:head>
Pessoa
</h:head>
<h:body>
<h:form id=“listagemUsuario”>
<p:growl id=“growl” showDetail=“true”/>

	<p:dataTable id="listagem" var="usuario" value="#{pessoaBean.dataModel}" paginator="true" rows="10" selection="#{pessoaBean.pessoa}" selectionMode="single">
		
		<p:ajax event="rowSelect" listener="#{pessoaBean.aoSelecionar}"  update=":listagemUsuario:visualizarDialog :listagemUsuario:growl" oncomplete="visualizarDialog.show()" />
	
		<p:column headerText="Nome" style=" width: 40%">#{usuario.nome}</p:column>
		<p:column headerText="Login" style="width: 15%">#{usuario.login}</p:column>
								 
	</p:dataTable>
	
	
	<p:dialog id="visualizarDialog" header="Dados do Usuário" widgetVar="visualizarDialog" width="400" modal="true" resizable="false">  
          <h:panelGrid columns="2">  
              <h:outputLabel value="Nome: "/>  
              <h:inputText value="#{pessoaBean.pessoa.nome}"/>  
              <h:outputLabel value="Login: "/>  
              <h:inputText value="#{pessoaBean.pessoa.login}"/>
          </h:panelGrid>  
      </p:dialog>
</h:form>

</h:body>

[/code]

Fala adi_silva, tranquilo?

O problema no seu caso é que você não está fazendo um update do dialog a cada seleção, então o conteúdo exibido na view permanece com os dados do primeiro usuário selecionado. Trabalhando com o primefaces, eu sempre deixo um <p:ajax> dentro do dataTable, para que assim que uma linha seja selecionada, o panel seja re-renderizado com os valores do novo usuário

Aqui eu resolvi da seguinte forma:

<p:dataTable
			id="tableFuncionario"
			widgetVar="tableFuncionario"
			var="func"
			value="#{permissionController.userList}"
			styleClass="centralizado"
			style="width: 60%"
			emptyMessage="Nenhum registro encontrado"
			paginator="true"
			paginatorAlwaysVisible="false"
			rowKey="#{func.userName}"
			selectionMode="single"
			selection="#{permissionController.selectedUser}"
			rows="15">

			<p:ajax
				event="rowSelect"
				process="@this"
				update=":form:dialogPermissao"
				oncomplete="dialogPermissao.show()" />

			<f:facet name="header">
				<h:outputText value="Pesquisa de funcionários" />
			</f:facet>

			<p:column
				style="width: 15%"
				headerText="Login"
				sortBy="#{func.userName}"
				styleClass="column">
				<h:outputText value="#{func.userName}" />
			</p:column>

			<p:column
				style="width: 55%"
				headerText="Nome completo"
				sortBy="#{func.fullName}"
				styleClass="column">
				<h:outputText value="#{func.fullName}" />
			</p:column>

			<p:column
				style="width: 30%"
				headerText="E-mail:"
				sortBy="#{func.mail}"
				styleClass="column">
				<h:outputText value="#{func.mail}" />
			</p:column>

			<f:facet name="footer">
				<h:outputText value="Clique em um funcionário para gerenciar a permissão" />
			</f:facet>

		</p:dataTable>

		<p:spacer
			width="100%"
			height="25" />

		<p:dialog
			id="dialogPermissao"
			modal="true"
			widgetVar="dialogPermissao"
			header="Gerenciar permissão"
			closable="true"
			draggable="false"
			resizable="false"
			styleClass="centralizado"
			width="340"
			onHide="tableFuncionario.unselectAllRows();">

			<h:panelGrid
				columns="2"
				styleClass="centralizado">
				<h:outputText
					styleClass="label"
					value="Nome: " />
				<h:outputText value="#{permissionController.selectedUser.fullName}" />
				<h:outputText
					styleClass="label"
					value="Login: " />
				<h:outputText value="#{permissionController.selectedUser.userName}" />
				<h:outputText
					styleClass="label"
					value="E-mail: " />
				<h:outputText value="#{permissionController.selectedUser.mail}" />
			</h:panelGrid>

			<p:spacer
				width="100%"
				height="5" />

			<p:commandButton
				id="btnConceder"
				value="Conceder permissão"
				icon="ui-icon-check"
				styleClass="centralizado"
				action="#{permissionController.grantPermission}"
				process="@this"
				oncomplete="tableFuncionario.unselectAllRows(); dialogPermissao.hide()" />

			<p:spacer width="5" />

			<p:commandButton
				id="btnRevogar"
				value="Revogar permissão"
				icon="ui-icon-close"
				styleClass="centralizado"
				action="#{permissionController.revokePermission}"
				process="@this"
				oncomplete="tableFuncionario.unselectAllRows(); dialogPermissao.hide()" />
		</p:dialog>

Dessa forma o dialog sempre é exibido quando se clica em uma linha do dataTable, e os dados do funcionário são carregados.
Lembre-se que é preciso criar uma propriedade no seu controller para armazenar o usuário selecionado da lista ok? :wink:

Valeo galera resolvido.

Usei a dica do nosso amigo hmsilva troquei o @form pelo nome do Dialog.

Ficou assim.


<p:commandLink oncomplete="visualizarDialog.show()"  update="visualizarDialog">
      <h:graphicImage library="imagens" name="visualizar_dados.png" />
      <f:setPropertyActionListener target="#{pessoaBean.pessoa}" value="#{usuario}" />
</p:commandLink>

<!-- Dialog -->

<p:dialog id="visualizarDialog" header="Dados do Usuário" widgetVar="visualizarDialog" width="400" modal="true" resizable="false">
            <h:panelGrid columns="2">
            <h:outputLabel value="Código: " />
            <h:outputLabel value="#{usuario.codigo}" />
            <h:outputLabel value="Nome: " />
            <h:inputText value="#{usuario.nome}" />
            <h:outputLabel value="Login: " />
            <h:inputText value="#{usuario.login}" />
            <h:outputLabel value="Status: " />
            <h:inputText value="#{usuario.ativo}" />
            <h:outputLabel value="Permissão: " />
            <h:inputText value="#{usuario.permissao}"/>
            <h:outputLabel value="Setor: " />
            <h:inputText value="#{usuario.setor}" />
            <h:outputLabel value="Cargo: " />
            <h:inputText value="#{usuario.cargo}" />
            <h:outputLabel value="Data Cadastro: " />
           <h:outputText value="#{usuario.dataCadastro}" />
     </h:panelGrid>
</p:dialog>

Grato pela ajuda de todos

Opa, Tamo injetado, compilado e executado…