[RESOLVIDO] Edição de Objeto retorna null no momento de finalizar a edição

Olá galera.

Estou com um probleminha na minha aplicação e gostaria da ajuda de vocês.

Uso JSF 2 e primefaces 3.4.

Na minha aplicaçao tenho um dataTable onde são listados vários objetos. Eu uso um selection para selecionar um desses objetos e poder editá-los em um dialog que é renderizado quando o usuário clica em editar. Até aqui tudo bem, o objeto é carregado corretamente no dialog com os valores do objeto selecionado no dataTable. O problema é depois que são feitas as alterações e o usuário clica no botão para finalizar a edição e é retornada uma exception dizendo que o objeto em questão está nulo:

javax.servlet.ServletException: /administrativo/cargo-teste.xhtml @75,82 value="#{cargoBean.cargoSelecionado.nome}": Target Unreachable, 'cargoSelecionado' returned null
javax.faces.webapp.FacesServlet.service(FacesServlet.java:606)

O estranho é que a linha que ele está reclamando @75,82 value="#{cargoBean.cargoSelecionado.nome}" é a mesma que exibe os valores dentro de uma inputText e está exibe os valores corretamente. Procurei na net e achei alguns casos onde o bean era reiniciado antes de finalizar uma ação, perdendo todos seus atributos. Não sei se é isso que acontece comigo, mas os sintomas são parecidos, e de qualquer forma, não sei como tratá-lo.

Abaixo segue o meu bean e meu xhtml.

CargoBean

package br.flexweb.beans;

import java.util.List;

import javax.faces.bean.ManagedBean;

import br.flexweb.dao.CargoDAO;
import br.flexweb.models.Cargo;

@ManagedBean
public class CargoBean {

	private Cargo cargo = new Cargo();
	private CargoDAO dao = new CargoDAO();
	private List<Cargo> cargos;
	private Cargo cargoSelecionado;

	public Cargo getCargo() {
		return cargo;
	}

	public void setCargo(Cargo cargo) {
		this.cargo = cargo;
	}

	public void cancelar() {
		limparFormulario();
	}

	private void limparFormulario() {
		this.cargo = new Cargo();
		this.cargos = dao.lista();
	}

	public List<Cargo> getCargos() {
		if (cargos == null) {
			this.cargos = dao.lista();
		}

		return cargos;
	}
	
	public void gravar() {
		
		dao.adicionar(cargo);

		limparFormulario();
	}
	
	public void atualizar() {
		cargoSelecionado = dao.busca(cargoSelecionado.getId());
		dao.atualizar(cargoSelecionado);
	}

	public void remover(Cargo cargo) {
		dao.remover(cargo);
		limparFormulario();
	}

	public Cargo getCargoSelecionado() {
		return cargoSelecionado;
	}

	public void setCargoSelecionado(Cargo cargoSelecionado) {
		this.cargoSelecionado = cargoSelecionado;
	}

}

cargo-teste.xhtml

<?xml version="1.0" encoding="UTF-8" ?>
<!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:ui="http://java.sun.com/jsf/facelets"
	  xmlns:f="http://java.sun.com/jsf/core"
	  xmlns:h="http://java.sun.com/jsf/html" 
	  xmlns:p="http://primefaces.org/ui">

	<h:body>
	
		<ui:composition template="/_template.xhtml" >
		
			<ui:define name="corpo" >	
			
				<h:form id="listagem">
				
					<p:dataTable value="#{cargoBean.cargos}" var="cargo" 
						paginator="true" rows="10" selectionMode="single" rowKey="#{cargo.id}"
						selection="#{cargoBean.cargoSelecionado}" emptyMessage="Nenhum registro encontrado..." >
						<p:ajax event="rowSelect" update=":editar" />						

						<p:column headerText="Código">
							#{cargo.id}
						</p:column>
						
						<p:column headerText="Cargo">
							#{cargo.nome}
						</p:column>
						
						<f:facet name="footer">
						
							<p:commandButton value="Novo Cargo" id="newCargoButton"
								onclick="nc.show()" type="button" >
							</p:commandButton>	
										
							<p:commandButton value="Editar Cargo" id="editCargoButton"
								 type="button" update="editar" onclick="ne.show()" />											
																										
						</f:facet>
																			
					</p:dataTable>					
				
				</h:form>
								
				<h:form id="novo">
									
					<p:dialog id="newCargo" header="Novo Cargo" widgetVar="nc" modal="true" >
						<p:ajax event="close" update=":listagem" />
						
						<h:panelGrid columns="2" >
						
							<h:outputText value="Nome: *" />
							<p:inputText id="nome" value="#{cargoBean.cargo.nome}" />
						
						</h:panelGrid>
						
						<p:commandButton value="Finalizar" action="#{cargoBean.gravar}" onclick="nc.close()" >
							<f:ajax event="click" update=":listagem" />
						</p:commandButton>						
					
					</p:dialog>		
				
				</h:form>
					
				<h:form id="editar">	
					
					<p:dialog id="editCargo" header="Editar Cargo" widgetVar="ne" modal="true" >
						
						<h:panelGrid columns="2" >

							<h:outputText value="Código: " />
							<p:inputText id="codigoEdicao" value="#{cargoBean.cargoSelecionado.id}" readonly="true" />
						
							<h:outputText value="Nome: *" />
							<p:inputText id="nomeEdicao" value="#{cargoBean.cargoSelecionado.nome}" />
						
						</h:panelGrid>
						
						<p:commandButton value="Finalizar" action="#{cargoBean.atualizar}" onclick="ne.close()" >
							<f:ajax event="click" update=":listagem" />
						</p:commandButton>						
					
					</p:dialog>					
																									
				</h:form>
																
			</ui:define>
		
		</ui:composition>
	
	</h:body>
	
</html>

Alguém tem uma dica para solucionar meu problema?

Obrigado.

No método get do cargoSelecionado:

public Cargo getCargoSelecionado() {  
        if (cargoSelecionado == null) {
                cargoSelecionado = new Cargo();
        }
        return cargoSelecionado;
}

Acredito que deva funcionar.

Abraços.

[quote=orxav]No método get do cargoSelecionado:

public Cargo getCargoSelecionado() {  
        if (cargoSelecionado == null) {
                cargoSelecionado = new Cargo();
        }
        return cargoSelecionado;
}

Acredito que deva funcionar.

Abraços.[/quote]

Mas se eu fizer isso vou perder a referencia pro objeto que estou tentando editar.

Não cheguei a testar mas vou tentar

Vlw

Olá Galera.

Meu problema era devido ao escopo de sessão. Como ele estava Request no momento em que eu tentava atualizar o objeto o bean era resetado e eu acabava perdendo a referência para o objeto que estava tentando editar. Usei o ViewScoped e resolveu o problema, mas acho que dessa forma vou acabar criando outro problema.

Se entendi bem, o ViewScoped ira manter os dados do bean durante toda a duração da sessão mas eu ainda não entendi bem o quanto dura uma sessão. O que é uma sessão mesmo?

Estou procurando na net mas não acho nada concreto.

Obrigado galera.