2
respostas

Null Pointer Exception - ViewAction e ViewPara

Estou implementando uma tela conforme os exemplos de Livro e Autor, porém estou com problema na renderização da tela após uma validação efetuada no ManagedBean. Está ocorrendo um Null Pointer Exception com o valor de um atributo que é recebido na tela pelo ViewParam. Pelo debug, o managedbean é chamado várias vezes, na primeira vez os valores estão corretos, mas da segunda em diante aparecem nulos.

O que pode estar ocorrendo?

Segue código da tela:

    <ui:define name="corpoParceiro">
        <section>
            <div class="container">
                <div class="block-header ">
                    <h6 class="text-uppercase mb-0 text-center">Informar o valor promocional</h6>
                </div>

                <f:metadata>
                    <f:viewParam name="produtoId" value="#{produtoPromocaoMB.produto.proId}" />
                    <f:viewParam name="primeiroAcesso" value="#{produtoPromocaoMB.primeiroAcesso}" />
                    <f:viewAction action="#{produtoPromocaoMB.irParaManterProdutoPromocao()}" if="#{produtoId > 0 and primeiroAcesso == 'true'}" />
                </f:metadata>

                <div class="block mb-5">
                    <div class="block-body">
                        <mens:mensagens />

                        <h:form class="form-horizontal" id="informarValor"  >
                            <!-- /.row-->
                            <div class="row">
                                <div class="col-sm-12">
                                    <div class="form-group">
                                        <label>
                                            <strong class="d-block text-uppercase" jsf:styleClass="font-size: 1.125rem;">#{produtoPromocaoMB.produto.nome}</strong>
                                        </label>
                                    </div>
                                </div>
                            </div>
                            <div class="row">
                                <div class="col-sm-4">
                                    <div class="form-group">
                                        <label for="estoque" class="form-label text-body">Valor Promocional</label>
                                        <input type="number" id="estoque" class="form-control " size="9" maxlength="9"
                                            jsf:value="#{produtoPromocaoMB.produtoPromocao.valorPromocional}" pattern="^\d+(?:\.\d{1,2})?$" 
                                            max="9999999.99" min="0.00" step="0.01" />
                                    </div>
                                </div>
                            </div>
                            <div class="row">
                                <div class="col-sm-4">
                                    <div class="form-group">
                                        <label for="inicioValidade" class="form-label">Data Início validade</label>
                                        <h:inputText pt:type="date" pt:min="01-01-1900" value="#{produtoPromocaoMB.dataInicio}"
                                            required="required" pt:class="form-control"  >
                                            <f:convertDateTime  pattern="yyyy-MM-dd" timeZone="America/Sao_Paulo" />
                                        </h:inputText>
                                    </div>
                                </div>
                                <div class="col-sm-3">
                                    <div class="form-group">
                                        <label for="inicioValidade" class="form-label">Hora Início validade</label>
                                        <h:inputText pt:type="time" value="#{produtoPromocaoMB.horaInicio}"
                                            pt:required="required" pt:class="form-control" >
                                            <f:convertDateTime  pattern="HH:mm" timeZone="America/Sao_Paulo" />
                                        </h:inputText>
                                    </div>
                                </div>
                            </div>
                            <div class="row">
                                <div class="col-sm-4">
                                    <div class="form-group">
                                        <label for="inicioValidade" class="form-label">Data Final validade</label>
                                        <h:inputText pt:type="date" pt:min="01-01-1900" value="#{produtoPromocaoMB.dataFinal}"
                                            pt:required="required" pt:class="form-control" >
                                            <f:convertDateTime  pattern="yyyy-MM-dd" timeZone="America/Sao_Paulo" />
                                        </h:inputText>
                                    </div>
                                </div>
                                <div class="col-sm-3">
                                    <div class="form-group">
                                        <label for="inicioValidade" class="form-label">Hora Final validade</label>
                                        <h:inputText pt:type="time" value="#{produtoPromocaoMB.horaFinal}"
                                            pt:required="required" pt:class="form-control" >
                                            <f:convertDateTime  pattern="HH:mm" timeZone="America/Sao_Paulo" />
                                        </h:inputText>
                                    </div>
                                </div>
                            </div>

                            <br />

                            <!-- /.row-->
                            <div class="col-sm-12">
                                <div class="row">
                                    <div class="col-sm-5">
                                        <button type="submit" class="btn btn-outline-primary" jsf:action="#{produtoPromocaoMB.salvarProdutoPromoca()}" jsf:id="salvarEstoque">
                                            <i class="far fa-save fa-lg"></i> Salvar Preço Produto
                                        </button>
                                    </div>
                                </div>
                            </div>
                        </h:form>
                    </div>

                </div>
            </div>
        </section>

    </ui:define>
  </ui:composition>
2 respostas

Oi Claidson,

a sua página é chamada atraves de um HTTP GET? Pelo que me lembro o ViewParam só funciona com GET, algo assim:

http://localhost:8080/sua-app-jsf/sua-pagina.jsf? produtoId=2& primeiroAcesso=True

abs, Nico

Olá Nico, A página está sendo chamada desta forma:

<h:link outcome="manterPromocao.jsf"  value="" styleClass="btn btn-outline-primary btn-wide text-uppercase font-weight-bold" >
    <f:param name="produtoId" value="#{produtoParceiroMB.produto.proId}" />
    <f:param name="primeiroAcesso" value="true" />                                        
</h:link>

A página é chamada corretamente e recebe os parâmetros passados. O problema é quando valido as informações no bean ao tentar salvar, lanço uma exception e carrego a tela novamente com a mensagem da exceção. Neste momento a tela chama o bean mais de uma vez, mas da segunda vez em diante os parâmetros estão com valor nulo. Na primeira chamada após lançar a exception os valores estão atribuídos.