3
respostas

Nenhuma exceção lançada no console

Estou usando Oracle JDK 8 e Eclipse Oxygen, e parti do projeto distribuído na primeira aula. Segui os passos no vídeo do instrutor, mas ao requisitar o id=13 (vídeo aos 1:55) o navegador recebe o erro HTTP 500 mas nenhuma exceção é lançada no console do Eclipse. Confirmei que no método CarrinhoResource.busca() o carrinho vem nulo. Também tentei lançar uma NullPointerException manualmente dentro do método, e o comportamento foi o mesmo.

É importante para depuração saber que houve uma exceção não tratada e qual foi, então gostaria de entender o motivo do comportamento diferente.

3 respostas

Oi Fernando,

Na verdade não deu exception pois o método não deve ter sido chamado.

No vídeo o instrutor alterou o código do Resource para que o id seja passado com parte da url, ao inves de ser um parametro da url.

Se você deixar o código assim:

@GET
@Produces(MediaType.APPLICATION_XML)
public Carrinho busca(@QueryParam("id") long id) {
    Carrinho carrinho = new CarrinhoDAO().busca(id);
    return carrinho;
}

Sem o @Path("{id}") em cima do método, e utilizando o @QueryParam("id"), somente conseguirá chamar o resource no browser chamanda a url dessa forma: http://localhost:8080/carrinhos?id=1

Mas após a alteração, o código fica assim:

@Path("{id}")
@GET
@Produces(MediaType.APPLICATION_XML)
public Carrinho busca(@PathParam("id") long id) {
    Carrinho carrinho = new CarrinhoDAO().busca(id);
    return carrinho;
}

E então o parametro id deve ser passado assim no browser: http://localhost:8080/carrinhos/1

Mas mesmo assim, se você chamar a url passando um id que não existe: http://localhost:8080/carrinhos/13

Não vai dar exception, pois a lógica do Resource apenas chama a DAO para buscar por id, e depois devolve o carrinho. Nesse caso será devolvido null para o browser.

Daria exception se você tentasse acessar alguma informação do carrinho. Por exemplo:

@Path("{id}")
@GET
@Produces(MediaType.APPLICATION_XML)
public Carrinho busca(@PathParam("id") long id) {
    Carrinho carrinho = new CarrinhoDAO().busca(id);
    System.out.println(carrinho.getId());
    return carrinho;
}

Não deve ser isso porque o método estava sendo chamado, confirmei que estava tanto com uma saída no sysout quanto com o acréscimo de um breakpoint. Só conseguir obter o mesmo comportamento adicionando o código desta resposta na inicialização da classe Servidor.

Oi Fernando,

Verdade, tem esse detalhe do Grizzly para habilitar o log de erros.