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.