Valores nulos no Bean

Boa tarde, pessoal.

Tenho um DataTable com um SingleSelection. Quando se clica em uma das linhas, uma Dialog é exibida com os valores do objeto selecionado.
Os dados são exibidos em um PanelGrid, dentro da Dialog. Tenho um CommandButton, que chama um método que invoca um método do Dao, responsável por fazer um update na base de dados.

Quando clico no CommandButton e ele chama o método do Bean, os dados do objetos estão nulos. Não sei onde está o erro.

Alguém sabe como posso corrigir isto?
Desde já, obrigado.

DataTable

<p:dataTable id="dataTableHEs" var="mhe" value="#{horaExtraBean.loadHorasExtrasRH()}" rowKey="#{mhe.id}"
                             paginator="true" rows="20" selectionMode="single" selection="#{horaExtraBean.horaExtra}" >

                    <p:ajax event="rowSelect" update=":mainForm:panelGridDialog :mainForm:panelGridDialog"
                            oncomplete="dialogModalSupervisao.show()" />

                    <p:growl id="mainGrowl" showDetail="true" />


                    <p:column headerText="Funcionário">
                        <h:outputText value="#{mhe.funcionario.nome}" />
                    </p:column>

                    <p:column headerText="Data Cad.">
                        <h:outputText value="#{mhe.dataCadastro}">
                            <f:convertDateTime pattern="dd/MM/yyyy" />
                        </h:outputText>
                    </p:column>

                    <p:column headerText="Data">
                        <h:outputText value="#{mhe.dataHoraExtra}">
                            <f:convertDateTime pattern="dd/MM/yyyy" />
                        </h:outputText>
                    </p:column>

                    <p:column headerText="Motivo">
                        <h:outputText value="#{mhe.motivo.descricao}" />
                    </p:column>

                    <p:column headerText="Data Aprov. Sup.">
                        <h:outputText value="#{mhe.dataAprovadoSupervisor}">
                            <f:convertDateTime pattern="dd/MM/yyyy" />
                        </h:outputText>
                    </p:column>

                    <p:column headerText="Aprovação Sup.">
                        <h:outputText value="#{mhe.aprovadoSupervisorOutput}" />
                    </p:column>

                    <p:column headerText="Data Aprov. RH">
                        <h:outputText value="#{mhe.dataAprovacaoRH}">
                            <f:convertDateTime pattern="dd/MM/yyyy" />
                        </h:outputText>
                    </p:column>

                    <p:column headerText="Aprovação RH">
                        <h:outputText value="#{mhe.aprovadoRHOutput}" />
                    </p:column>

                    <p:column headerText="Motivo Cancel.">
                        <h:outputText value="#{mhe.motivoCancelamento.descricao}" />
                    </p:column>

                    <p:column headerText="Tot. Horas">
                        <h:outputText value="#{mhe.quantidadeHoraExtraGerada}" />
                    </p:column>

                    <p:column headerText="Tipo">
                        <h:outputText value="#{mhe.tipoHoraExtraGerada}" />
                    </p:column>

                    <p:column headerText="Obs.">
                        <h:outputText value="#{mhe.observacoes}" />
                    </p:column>

                </p:dataTable>

Dialog

<p:dialog id="dialogModalSupervisao" header="Revisão de Hora Extra" widgetVar="dialogModalSupervisao"
                      modal="true" width="360" height="260" resizable="false">

                <h:panelGrid id="panelGridDialog" columns="2" cellpadding="1" class="dialog-form">

                    <p:outputLabel for="inputData" id="lblData" value="Data da Hora Extra:" />
                    <p:calendar disabled="true" id="inputData" value="#{horaExtraBean.horaExtra.dataHoraExtra}" navigator="true" pattern="dd/MM/yyy" showOn="button">
                        <f:convertDateTime pattern="dd/MM/yy" timeZone="GMT-3" type="date" locale="pt" dateStyle="short"/>
                    </p:calendar>

                    <p:outputLabel for="calendarData" id="lblDataSolicitacao" value="Data da Solicitação:" />
                    <p:calendar disabled="true" id="calendarData" value="#{horaExtraBean.horaExtra.dataCadastro}" navigator="true" pattern="dd/MM/yyy" showOn="button">
                        <f:convertDateTime pattern="dd/MM/yy" timeZone="GMT-3" type="date" locale="pt" dateStyle="short"/>
                    </p:calendar>

                    <p:outputLabel for="autoCompleteMotivo" id="lblMotivo" value="Motivo:" />
                    <p:autoComplete disabled="true" id="autoCompleteMotivo" value="#{horaExtraBean.horaExtra.motivo.descricao}" completeMethod="#{motivoBean.autocompleteDescricao()}" dropdown="true" scrollHeight="150" />

                    <p:outputLabel for="spinnerTotalDeHoras" id="lblTotalDeHoras" value="Qdt. de Horas:" />
                    <p:spinner disabled="true" id="spinnerTotalDeHoras" value="#{horaExtraBean.horaExtra.quantidadeHoraExtraGerada}" size="2" />

                    <p:outputLabel for="inputTextAreaObservacoes" value="Observações:" />
                    <p:inputTextarea disabled="true" id="inputTextAreaObservacoes" value="#{horaExtraBean.horaExtra.observacoes}" cols="24" rows="3" />

                    <p:selectOneRadio disabled="#{horaExtraBean.horaExtra.aprovadoSupervisor != 1}" id="aprovacao" value="#{horaExtraBean.horaExtra.aprovadoRH}">
                        <p:ajax process=":mainForm:panelGridDialog" event="change" />
                        <f:selectItem itemLabel="Aprovar" itemValue="Aprovado" />
                        <f:selectItem itemLabel="Reprovar" itemValue="Reprovado" />
                    </p:selectOneRadio>

                    <p:outputLabel for="autoCompleteMotivoCancelamento" id="lblMotivoCancelamento" value="Motivo do Cancelamento: " />

                    <p:autoComplete disabled="#{(horaExtraBean.horaExtra.aprovadoRH != 'Reprovado') or (horaExtraBean.horaExtra.aprovadoSupervisor != 1)}"
                                    id="autoCompleteMotivoCancelamento"
                                    completeMethod="#{motivoCancelamentoBean.autocompleteDescricao()}"
                                    value="#{horaExtraBean.horaExtra.motivoCancelamento.descricao}"
                                    dropdown="true" scrollHeight="150">
                    </p:autoComplete>
                    
                        <p:commandButton disabled="#{horaExtraBean.horaExtra.aprovadoSupervisor != 1}" value="Concluir"
                                         action="#{horaExtraBean.updateAprovacaoRH()}"
                                         update=":mainForm:dataTableHEs"
                                         onclick="dialogModalSupervisao.close()"
                                         oncomplete="#{horaExtraBean.loadHorasExtrasRH()}"
                                         icon="ui-icon-check"/>

                </h:panelGrid>
            </p:dialog>

Método do Bean

public void updateAprovacaoRH() {

        if (this.horaExtra.getAprovadoRH().equals(EEstadoAprovacao.Reprovado) && this.horaExtra.getMotivoCancelamento() != null) {
            MotivoCancelamentoDao motivoCancelamentoDao = new MotivoCancelamentoDao();
            MotivoCancelamento motivoCancelamento = new MotivoCancelamento();
            motivoCancelamento = motivoCancelamentoDao.getByDescricao(this.horaExtra.getMotivoCancelamento().getDescricao());
            this.horaExtraDao.updateAprovacaoRH(this.horaExtra, motivoCancelamento.getId());
        } else {
            this.horaExtraDao.updateAprovacaoRH(this.horaExtra, 0);
        }
    }

não precisa passar o bean como parâmetro?

<f:setPropertyActionListener value="#{car}" target="#{tableBean.selectedCar}" /> 

igual esse exemplo do primefaces

http://www.primefaces.org/showcase/ui/datatableRowSelectionByColumn.jsf

Fala, Igor. Beleza?

Então… já estou fazendo isso:

<p:dataTable id="dataTableHEs" var="mhe" value="#{horaExtraBean.loadHorasExtrasRH()}" rowKey="#{mhe.id}" paginator="true" rows="20" selectionMode="single" selection="#{horaExtraBean.horaExtra}" >

Ps: Tenho outras telas similares, que funcionam perfeitamente, mas essa está me dando dor de cabeça. :confused:

Parece estar certo, poderia postar o erro que dá ou postar o seu bean?

Exceção

javax.faces.FacesException: #{horaExtraBean.updateAprovacaoRH()}: java.lang.NullPointerException
	at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:117)
	at javax.faces.component.UICommand.broadcast(UICommand.java:315)
	at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:794)
	at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1259)
	at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:81)
	at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
	at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
	at javax.faces.webapp.FacesServlet.service(FacesServlet.java:593)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:304)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
	at org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:393)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:240)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:164)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:462)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
	at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:562)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:395)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:250)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:188)
	at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:302)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
	at java.lang.Thread.run(Thread.java:722)
Caused by: javax.faces.el.EvaluationException: java.lang.NullPointerException
	at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:102)
	at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:101)
	... 26 more
Caused by: java.lang.NullPointerException
	at bean.HoraExtraBean.updateAprovacaoRH(HoraExtraBean.java:309)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:601)
	at org.apache.el.parser.AstValue.invoke(AstValue.java:262)
	at org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:278)
	at com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:105)
	at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:88)
	... 27 more

[/b]Meu Bean:[b]

@ManagedBean
@ViewScoped
public class HoraExtraBean implements Serializable {

    private HoraExtra horaExtra = new HoraExtra();
    private ArrayList<HoraExtra> minhasHorasExtrasList = new ArrayList<HoraExtra>();
    private ArrayList<HoraExtra> horasExtrasListSupervisor = new ArrayList<HoraExtra>();
    private ArrayList<HoraExtra> horasExtrasListRH = new ArrayList<HoraExtra>();
    private HoraExtraDao horaExtraDao = new HoraExtraDao();
    private MotivoDao motivoDao = new MotivoDao();
    private FuncionarioDao funcionarioDao = new FuncionarioDao();
    private MotivoCancelamentoDao motivoCancelamentoDao = new MotivoCancelamentoDao();
    private SessionManager sm = SessionManager.getInstance();
    private Funcionario funcionarioLogado = new Funcionario();
    private Projeto projeto = new Projeto();
    private ProjetoDao projetoDao = new ProjetoDao();
    private Funcionario funcionario = new Funcionario();
    private ArrayList<HoraExtra> horasExtrasFuncionarioList = new ArrayList<HoraExtra>();

    public HoraExtraBean() {
        this.funcionarioLogado.setMatricula(this.sm.funcionario.getMatricula());
        if (this.sm.usuario.getPerfil().equals("RH")) {
            this.horaExtra = new HoraExtra();
            this.loadHorasExtrasRH();
        } else if (this.sm.usuario.getPerfil().equals("Supervisor")) {
            this.loadHorasExtrasSupervisor();
        } else if (this.sm.usuario.getPerfil().equals("Funcionario")) {
            this.loadMinhasHorasExtras();
        }
    }

    public ArrayList<HoraExtra> loadMinhasHorasExtras() {
        this.minhasHorasExtrasList = new ArrayList<HoraExtra>();
        this.minhasHorasExtrasList = this.horaExtraDao.getByFuncionario(this.sm.funcionario.getMatricula());
        this.minhasHorasExtrasList = putMotivos(this.minhasHorasExtrasList);

        return this.minhasHorasExtrasList;
    }

    public ArrayList<HoraExtra> loadHorasExtrasSupervisor() {
        this.horasExtrasListSupervisor = new ArrayList<HoraExtra>();
        this.horasExtrasListSupervisor = this.horaExtraDao.getAll(EQueryFilter.Supervisor);
        this.horasExtrasListSupervisor = putFuncionarios(horasExtrasListSupervisor);
        this.horasExtrasListSupervisor = putMotivos(this.horasExtrasListSupervisor);
        return this.horasExtrasListSupervisor;
    }

    public ArrayList<HoraExtra> loadHorasExtrasRH() {
        this.horasExtrasListRH = new ArrayList<HoraExtra>();
        this.horasExtrasListRH = this.horaExtraDao.getAll(EQueryFilter.RH);
        this.horasExtrasListRH = putFuncionarios(horasExtrasListRH);
        this.horasExtrasListRH = putMotivos(this.horasExtrasListRH);
        return this.horasExtrasListRH;
    }

    public void loadHorasExtrasRHByProjeto() {

        this.projeto = this.projetoDao.getByDescricao(this.projeto.getDescricao());

        this.horasExtrasListRH = new ArrayList<HoraExtra>();
        this.horasExtrasListRH = this.horaExtraDao.getByProjeto(this.projeto.getId());
        this.horasExtrasListRH = putFuncionarios(horasExtrasListRH);
        this.horasExtrasListRH = putMotivos(this.horasExtrasListRH);
    }

    public void loadHorasExtrasRHByMes() {

        Calendar calendar = Calendar.getInstance();
        if (this.horaExtra.getDataHoraExtra() != null) {
            calendar.setTime(this.horaExtra.getDataHoraExtra());
            this.horaExtra.setAno(calendar.get(Calendar.YEAR));
            this.horaExtra.setMes(calendar.get(Calendar.MONTH));

            this.horasExtrasListRH = new ArrayList<HoraExtra>();
            this.horasExtrasListRH = this.horaExtraDao.getByMes(this.horaExtra.getMes(), this.horaExtra.getAno());
            this.horasExtrasListRH = putFuncionarios(horasExtrasListRH);
            this.horasExtrasListRH = putMotivos(this.horasExtrasListRH);
        }
    }

    public void loadHorasExtrasRHByFuncionario() {

        this.horasExtrasFuncionarioList = new ArrayList<HoraExtra>();
        this.funcionario = this.funcionarioDao.getByNome(this.funcionario.getNome());
        this.horasExtrasFuncionarioList = this.horaExtraDao.getByFuncionario(this.funcionario.getMatricula());
        this.horasExtrasFuncionarioList = putMotivos(this.horasExtrasFuncionarioList);
    }

    public ArrayList<HoraExtra> putFuncionarios(ArrayList<HoraExtra> heList) {

        Funcionario funcionario = new Funcionario();
        ArrayList<HoraExtra> heListAux = new ArrayList<HoraExtra>();

        for (HoraExtra horaExtra1 : heList) {
            funcionario = this.funcionarioDao.getByMatricula(horaExtra1.getFuncionario().getMatricula());
            horaExtra1.setFuncionario(funcionario);
            heListAux.add(horaExtra1);
        }

        return heListAux;
    }

    public ArrayList<HoraExtra> putMotivos(ArrayList<HoraExtra> heList) {

        Motivo motivo = new Motivo();
        MotivoCancelamento motivoCancelamento = new MotivoCancelamento();
        ArrayList<HoraExtra> heListAux = new ArrayList<HoraExtra>();

        for (HoraExtra horaExtra1 : heList) {

            motivo = this.motivoDao.getByID(horaExtra1.getMotivo().getId());
            horaExtra1.setMotivo(motivo);

            motivoCancelamento = motivoCancelamentoDao.getByID(horaExtra1.getMotivoCancelamento().getId());
            horaExtra1.setMotivoCancelamento(motivoCancelamento);

            heListAux.add(horaExtra1);
        }

        return heListAux;
    }

    public void insertBasic() {

        this.horaExtra.setFuncionarioCadastro(this.sm.funcionario);
        this.horaExtra.setFuncionario(this.sm.funcionario);

        Calendar calendar = Calendar.getInstance();
        calendar.setTime(this.horaExtra.getDataInicial());
        this.horaExtra.setAno(calendar.get(Calendar.YEAR));
        this.horaExtra.setMes(calendar.get(Calendar.MONTH));

        if (calendar.get(Calendar.DAY_OF_WEEK) == 1 || calendar.get(Calendar.DAY_OF_WEEK) == 7) {
            this.horaExtra.setTipoHoraExtraGerada(ETipoHoraExtra.Completa);
        } else {
            this.horaExtra.setTipoHoraExtraGerada(ETipoHoraExtra.Percentual);
        }

        this.horaExtra.setDataHoraExtra(this.horaExtra.getDataInicial());
        
        Motivo motivo = new Motivo();
        motivo = this.motivoDao.getByDescricao(this.horaExtra.getMotivo().getDescricao());

        this.horaExtra.setMotivo(motivo);

        this.horaExtra.setQuantidadeHoraExtraGerada(this.calcularDiferencaHoras(this.horaExtra.getDataInicial(), this.horaExtra.getDataFinal()));
        
        this.funcionario.setSaldoHoraExtra(this.funcionario.getSaldoHoraExtra() + this.horaExtra.getQuantidadeHoraExtraGerada());
        this.funcionarioDao.updateSaldoHoraExtra(this.funcionario);
        
        this.horaExtraDao.insertBasic(this.horaExtra, false);

        this.loadMinhasHorasExtras();
    }

    public void updateAprovacaoSupervisor() {
        this.horaExtraDao.updateAprovacaoSupervisor(this.horaExtra);
        this.loadHorasExtrasSupervisor();
    }

    public boolean statusAprovacaoSupervisor() {
        if (this.horaExtra.getAprovadoSupervisor() == 0) {
            return false;
        }
        return true;
    }

    public void updateAprovacaoRH() {

        if (this.horaExtra.getAprovadoRH().equals(EEstadoAprovacao.Reprovado) && this.horaExtra.getMotivoCancelamento() != null) {
            MotivoCancelamentoDao motivoCancelamentoDao = new MotivoCancelamentoDao();
            MotivoCancelamento motivoCancelamento = new MotivoCancelamento();
            motivoCancelamento = motivoCancelamentoDao.getByDescricao(this.horaExtra.getMotivoCancelamento().getDescricao());
            this.horaExtraDao.updateAprovacaoRH(this.horaExtra, motivoCancelamento.getId());
        } else {
            this.horaExtraDao.updateAprovacaoRH(this.horaExtra, 0);
        }
    }

    public void debitarSaldoHorasFuncionario() {
        if (this.funcionario.getSaldoHoraExtra() > 30) {
            this.funcionario.setSaldoHoraExtra(this.funcionario.getSaldoHoraExtra() - 30);
        } else {
            this.funcionario.setSaldoHoraExtra(0);
        }
        this.horaExtraDao.debitarSaldoHorasFuncionario(this.funcionario);
        this.horaExtra = null;
        this.valorCalculadoHEs = 0;
        this.funcionario = null;
        this.saldoPosDebito = 0;
    }

    public HoraExtra getHoraExtra() {
        if (this.horaExtra == null) {
            this.horaExtra = new HoraExtra();
            this.horaExtra.setFuncionario(new Funcionario());
        }
        return horaExtra;
    }

    public void setHoraExtra(HoraExtra horaExtra) {
        this.horaExtra = horaExtra;
    }

    public ArrayList<HoraExtra> getMinhasHorasExtrasList() {
        return minhasHorasExtrasList;
    }

    public void setMinhasHorasExtrasList(ArrayList<HoraExtra> minhasHorasExtrasList) {
        this.minhasHorasExtrasList = minhasHorasExtrasList;
    }

    public ArrayList<HoraExtra> getHorasExtrasListSupervisor() {
        return horasExtrasListSupervisor;
    }

    public void setHorasExtrasListSupervisor(ArrayList<HoraExtra> horasExtrasListSupervisor) {
        this.horasExtrasListSupervisor = horasExtrasListSupervisor;
    }

    public ArrayList<HoraExtra> getHorasExtrasListRH() {
        return horasExtrasListRH;
    }

    public void setHorasExtrasListRH(ArrayList<HoraExtra> horasExtrasListRH) {
        this.horasExtrasListRH = horasExtrasListRH;
    }

    public Funcionario getFuncionarioLogado() {
        return funcionarioLogado;
    }

    public Projeto getProjeto() {
        if (this.projeto == null) {
            this.projeto = new Projeto();
        }
        return projeto;
    }

    public void setProjeto(Projeto projeto) {
        this.projeto = projeto;
    }

    public Funcionario getFuncionario() {
        if (this.funcionario == null) {
            this.funcionario = new Funcionario();
        }
        return funcionario;
    }

    public void setFuncionario(Funcionario funcionario) {
        this.funcionario = funcionario;
    }

    public ArrayList<HoraExtra> getHorasExtrasFuncionarioList() {
        return horasExtrasFuncionarioList;
    }

    public void setHorasExtrasFuncionarioList(ArrayList<HoraExtra> horasExtrasFuncionarioList) {
        this.horasExtrasFuncionarioList = horasExtrasFuncionarioList;
    }

post sua classe HoraExtraBean, tive um problema semelhante com instância de classe.

Quando vc chama o dialog, são todos os dados que aparecem nulo?

aprendizweb, quando chamo a Dialog, todos os dados aparecem normalmente, entretanto, quando clico no commandButton e o método é chamado, os valores estão nulos.

Uma vez isso ocorreu quando eu tinha deixado o bean como request. Fica a dica.

Meu bean tá como ViewScopped.

já testou com @SessionScoped!!!

Sim, e também não funcionou. Mas o ideal é que seja o ViewScopped.

Acabei de perceber que o parâmetro do método setHoraExtra(HoraExtra horaExtra) está vindo nulo.
Mas continuo sem saber o que está ocorrendo.