Solucionado (ver solução)
Solucionado
(ver solução)
5
respostas

NullPointerException ao cadastrar produto

Olá!

Ao fazer o cadastro de um produto estou tomando um NullPointerException, só não entedi o pq, pelo que percebi a linha que esta dando a exception é na linha que estamos usando o Optional do java 8, segue a stracktrace:

play.api.http.HttpErrorHandlerExceptions$$anon$1: Execution exception[[CompletionException: java.lang.NullPointerException]]
        at play.api.http.HttpErrorHandlerExceptions$.throwableToUsefulException(HttpErrorHandler.scala:280)
        at play.api.http.DefaultHttpErrorHandler.onServerError(HttpErrorHandler.scala:206)
        at play.api.GlobalSettings$class.onError(GlobalSettings.scala:160)
        at play.api.DefaultGlobal$.onError(GlobalSettings.scala:188)
        at play.api.http.GlobalSettingsHttpErrorHandler.onServerError(HttpErrorHandler.scala:98)
        at play.core.server.netty.PlayRequestHandler$$anonfun$2$$anonfun$apply$1.applyOrElse(PlayRequestHandler.scala:100)
        at play.core.server.netty.PlayRequestHandler$$anonfun$2$$anonfun$apply$1.applyOrElse(PlayRequestHandler.scala:99)
        at scala.concurrent.Future$$anonfun$recoverWith$1.apply(Future.scala:344)
        at scala.concurrent.Future$$anonfun$recoverWith$1.apply(Future.scala:343)
        at scala.concurrent.impl.CallbackRunnable.run(Promise.scala:32)
Caused by: java.util.concurrent.CompletionException: java.lang.NullPointerException
        at java.util.concurrent.CompletableFuture.encodeThrowable(CompletableFuture.java:292)
        at java.util.concurrent.CompletableFuture.completeThrowable(CompletableFuture.java:308)
        at java.util.concurrent.CompletableFuture.uniApply(CompletableFuture.java:593)
        at java.util.concurrent.CompletableFuture$UniApply.tryFire(CompletableFuture.java:577)
        at java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:474)
        at java.util.concurrent.CompletableFuture.completeExceptionally(CompletableFuture.java:1977)
        at scala.concurrent.java8.FuturesConvertersImpl$CF.apply(FutureConvertersImpl.scala:21)
        at scala.concurrent.java8.FuturesConvertersImpl$CF.apply(FutureConvertersImpl.scala:18)
        at scala.concurrent.impl.CallbackRunnable.run(Promise.scala:32)
        at scala.concurrent.BatchingExecutor$Batch$$anonfun$run$1.processBatch$1(BatchingExecutor.scala:63)
Caused by: java.lang.NullPointerException: null
        at java.util.Objects.requireNonNull(Objects.java:203)
        at java.util.Optional.<init>(Optional.java:96)
        at java.util.Optional.of(Optional.java:108)
        at daos.ProdutoDAO.comCodigo(ProdutoDAO.java:21)
        at validadores.ValidadorDeProduto.temErros(ValidadorDeProduto.java:20)
        at controllers.ProdutoController.salvaNovoProduto(ProdutoController.java:22)
        at router.Routes$$anonfun$routes$1$$anonfun$applyOrElse$2$$anonfun$apply$2.apply(Routes.scala:177)
        at router.Routes$$anonfun$routes$1$$anonfun$applyOrElse$2$$anonfun$apply$2.apply(Routes.scala:177)
        at play.core.routing.HandlerInvokerFactory$$anon$4.resultCall(HandlerInvoker.scala:157)
        at play.core.routing.HandlerInvokerFactory$$anon$4.resultCall(HandlerInvoker.scala:156)
5 respostas

Oi Christian! Coloca seu código do do ProdutoDAO pra a gente conferir?

Claro, segue a clasee ProdutoDao :

package daos;

import java.util.List;
import java.util.Map;
import java.util.Optional;

import com.avaje.ebean.ExpressionList;
import com.avaje.ebean.Model.Finder;

import models.Produto;

public class ProdutoDAO {

    private Finder<Long, Produto> produtos = new Finder<>(Produto.class);

    public Optional<Produto> comCodigo(String codigo) {
        Produto produto = produtos
                .where()
                .eq("codigo", codigo)
                .findUnique();
        return Optional.of(produto);
    }

    public List<Produto> todos() {
        return produtos.all();
    }

    public List<Produto> doTipo(String tipo) {
        return produtos.where().eq("tipo", tipo).findList();
    }

    public List<Produto> comFiltro(Map<String, String> parametros) {
        ExpressionList<Produto> consulta = produtos.where();
        parametros.entrySet().forEach(entrada -> {
            consulta.eq(entrada.getKey(), entrada.getValue());
        });
        return consulta.findList();
    }
}

Olá Christian tudo bem?

Pela mensagem de erro o problema esta no seu método comCodigo. O erro diz que na linha do retorno

return Optional.of(produto);

a variavel produto esta nula. Entao o problema é que sua consulta

produtos.where().eq("codigo", codigo).findUnique();

não esta retornando nada.

solução!

Oi Christian! Me parece que a sua query não está retornando nenhum resultado. Você tem certeza que existe algum Produto no banco de dados com o código que vc está pesquisando?

O jeito correto para usar o Optional nesse caso seria usar o Optional.ofNullable(produto), assim, se o produto estiver null ele te retorna um Optional Empty em vez de lançar a exception

Realmente, o certo era Option.ofNullable. Pois o metódo era pra saber se já existia algum produto com o código cadastrado no banco. Obrigado!