[ Resolvido ] - JSF / Primefaces - Como obter o valor do objeto da view para o ManagedBean

Estou criando uma aplicação de teste com JSF e Primefaces, mas estou com problemas para fazer um update em uma tabela do banco de dados.

Estou pegando o erro de NullPointerException ao dar o update (estou usando hibernate).

Esta é a minha view:

alterar.xhtml

[code]<?xml version="1.0" encoding="UTF-8" ?>

<h:head>

Alterar Plataforma
</h:head>
<h:body>
<p:panel header=“Alterar Plataforma”>
<h:form>
<p:growl />
<p:fieldset legend=“Dados da Plataforma”>
<p:outputLabel value=“Descrição” for=“descPlataforma” />
<p:inputText id=“descPlataforma” required=“true” value="#{plataformaBean.plataforma.descPlataforma}"/>
</p:fieldset>
<p:commandButton value=“Alterar” action="#{plataformaBean.altera}">
<f:setPropertyActionListener target="#{plataformaBean.plataforma}" value="#{plataforma}" />
</p:commandButton>
</h:form>
</p:panel>
</h:body>

[/code] Minha dúvida é saber como pegar o objeto da view para o meu [b]ManagedBean[/b] na hora de atualizar...

E o meu ManagedBean:

PlataformaBean

[code]@ManagedBean
@RequestScoped
public class PlataformaBean implements Serializable{

private Plataforma plataforma;

public Plataforma getPlataforma() {
	if(plataforma == null){
		plataforma = new Plataforma();
	}
	return plataforma;
}

public void setPlataforma(Plataforma plataforma) {
	this.plataforma = plataforma;
}

public List<Plataforma> getPlataformas() throws Exception{
	return new PlataformaDao().findAll();
}

public String inserePlataforma() {
	new PlataformaDao().salvar(plataforma);
	return "lista";
}

public String remove() {
	new PlataformaDao().excluir(plataforma.getIdPlataforma());
	return "lista";
}

public String altera() {
	System.out.println(plataforma.getDescPlataforma());  // aqui ocorre o NullPointerException

// new PlataformaDao().alterar(plataforma);
return “lista”;
}
}
[/code]
Alguma sugestão?

James, geralmente eu pego o objeto de um <p:dataTable/> ou afins e seleciono ele para edição, após isto faço o redirecionamento para a pagina de edição:

<p:dataTable var="plataforma" value="#{plataformaBean.listarTodos()}" rendered="true">
	<p:column >
		<f:facet name="header">Descrição</f:facet>
		<h:outputText value="#{plataforma.descPlataforma}"/>
	</p:column>
	<p:column >
		<h:commandLink action="#{plataformaBean.altera}" value="Editar">
			<f:setPropertyActionListener target="#{plataformaBean.plataforma}" value="#{plataforma}"/>
		</h:commandLink>
	</p:column>
</p:dataTable>

No ManageBean

public String altera() {
	return "alterar";  
} 

public String salvar() {  
	new PlataformaDao().alterar(plataforma);  
	return "lista";  
} 

No commandButton da sua pagina de alterar não precisaria mais do setPropertyActionListener ficaria:

<p:commandButton value="Alterar" action="#{plataformaBean.salvar()}"/>

Obs: não deu para mim testar o exemplo, espero ter ajudado.

Nesh, muito obrigado! Ajudou muito!

Agora acho que falta pouco. Segui a sua estratégia e tudo está funcionando quase perfeitamente.

Notei que ao gravar ao invés de atualizar o registro ele cria outro. Quando fiz o debug, vi que o código da Plataforma não veio da view, somente a descrição. Sabe como fazer para setar o código no objeto da view para que o ManagedBean consiga enxergar ?

Obrigado!

Foi agora!!

Quando adicionei um inputHidden com o código na view funcionou redondo!!

Minha view ficou assim:

[code]<?xml version="1.0" encoding="UTF-8" ?>

<h:head>

Alterar Plataforma
</h:head>
<h:body>
<p:panel header=“Alterar Plataforma”>
<h:form>
<p:growl />
<h:inputHidden id=“idPlataforma” value="#{plataformaBean.plataforma.idPlataforma}" />
<p:fieldset legend=“Dados da Plataforma”>
<p:outputLabel value=“Descrição” for=“descPlataforma” />
<p:inputText id=“descPlataforma” required=“true” value="#{plataformaBean.plataforma.descPlataforma}"/>
</p:fieldset>
<p:commandButton value=“Alterar” action="#{plataformaBean.altera}" />
</h:form>
</p:panel>
</h:body>

[/code] Valeu, galera!