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

3 respostas
J

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
<?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:f="http://java.sun.com/jsf/core"
	xmlns:h="http://java.sun.com/jsf/html"
	xmlns:p="http://primefaces.org/ui">

<h:head>
	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
	<title>Alterar Plataforma</title>
</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>
</html>
Minha dúvida é saber como pegar o objeto da view para o meu ManagedBean na hora de atualizar...

E o meu ManagedBean:

PlataformaBean

@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";
	}
}
Alguma sugestão?

3 Respostas

N

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.

J

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!

J

Foi agora!!

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

Minha view ficou assim:

<?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:f="http://java.sun.com/jsf/core"
	xmlns:h="http://java.sun.com/jsf/html"
	xmlns:p="http://primefaces.org/ui">

<h:head>
	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
	<title>Alterar Plataforma</title>
</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>
</html>
Valeu, galera!
Criado 9 de junho de 2013
Ultima resposta 11 de jun. de 2013
Respostas 3
Participantes 2