O que veremos por aqui:
- Criar o Método getById(Long id) para listar uma Postagem específica
Na etapa anterior, começamos a construir a Classe PostagemController e implementamos o Método getAll(), que retorna todos os Objetos da Classe Postagem persistidos no Banco de dados. Vamos continuar a construção da nossa Classe Controladora implementando o Método getById( Long id ).
Vamos implementar o Método getById(Long id) na Classe Postagem Controller, que retornará um Objeto específico persistido no Banco de dados, identificado pelo id (Identificador único do Objeto). Traçando um paralelo com o MySQL, seria o equivalente a instrução: SELECT * FROM tb_postagens where id = id;
.
Para processar o Método findById(Long id), vamos utilizar dois recursos da Linguagem Java, que tornam o código mais limpo e assertivo. São os recursos Optional e as Expressões Lambda.
Optional (map): É um contêiner para um valor que pode estar ausente. Em nosso contexto, tem como principal função evitar o erro do tipo NullPointerException (Objeto nulo), caso o Objeto Postagem procurado pelo Método findById(id) não seja encontrado. O retorno do Método NÃO pode ser NULO, por isso fazemos uso do Optional para que ele faça o encapsulamento do Objeto e informe se ele possui dados (está presente) ou não.
Expressões Lambda: Representam uma função anônima, ou seja, uma função Lambda é uma função sem declaração de nome, tipo de retorno e modificador de acesso. A ideia é que o Método seja declarado no mesmo lugar em que será usado e a sua declaração seja implícita. Esse conceito de função sem corpo vem do Paradigma da Programação Funcional. As Expressões Lambda em Java tem a sintaxe definida como: (argumento) 🡪 (corpo)
. Para efeito de comparação, a Linguagem Javascript/Typescript também possuem um recurso semelhante, que são as chamadas Arrow Functions.
DICA: Caso você tenha alguma dúvida sobre Optional e Expressões Lambda, no Cookbook de Java do Bloco 1 e consulte os respectivos tópicos. |
---|
Linha 30: A anotação @GetMapping("/{id}") mapeia todas as Requisições HTTP GET, enviadas para um endereço específico (Endpoint), dentro do Recurso Postagem, para um Método específico que responderá as requisições, ou seja, ele indica que o Método getById( Long id ), responderá a todas as requisições do tipo HTTP GET, enviadas no endereço http://localhost:8080/postagens/id, onde id é uma Variável de Caminho (Path Variable), que receberá o id da Postagem que será Consultada.
Linha 31: O Método getById(@PathVariable Long id) será do tipo ResponseEntity porque ele responderá Requisições HTTP (HTTP Request), com uma Resposta HTTP (HTTP Response). Observe que o Método possui um parâmetro do tipo Long, chamado id.
@PathVariable Long id: Esta anotação insere o valor enviado no endereço do endpoint, na Variável de Caminho {id}, no parâmetro do Método getById( Long id );
Exemplo:
http://localhost:8080/postagens/1
No exemplo acima, o parâmetro Long id, do Método getById( Long id ), receberá o valor 1 (Id que será procurado na tabela tb_postagens)
ATENÇÃO: Por questões de boas práticas e legibilidade do código, a Variável de Caminho e o Parâmetro do Método getById devem possuir o mesmo nome. |
---|
: O Método além de retornar um objeto da Classe ResponseEntity (OK🡪200), no parâmetro Body (Corpo da Resposta), será retornado Um Objeto da Classe Postagem, apenas e somente se o Objeto procurado for encontrado no Banco de dados, na tabela tb_postagens. Observe que nesta linha também foi utilizado o recurso Java Generics para simplificar o retorno do Objeto
<T>
, onde T é o tipo de retorno do Corpo da Resposta.
Linha 32:
return postagemRepository.findById(Long id): Retorna a execução do Método findById(id), que é um Método padrão da Interface JpaRepository. O Método retornará um Objeto da Classe Postagem persistido no Banco de dados (), caso ele seja encontrado a partir do parâmetro Long id. Caso contrário, será retornado um Objeto Nulo (null).
.map(resposta 🡪 ResponseEntity.ok(resposta)): Se o Objeto da Classe Postagem for encontrado, o Método map (Optional), mapeia no Objeto resposta o Objeto Postagem retornado pelo Método findById(id), insere o Objeto mapeado no Corpo da Resposta do Método ResponseEntity.ok(resp); e retorna o HTTP Status OK🡪200.
.orElse(ResponseEntity.notFound().build());: Se o Objeto Postagem não for encontrado (Nulo), será retornado o HTTP Status NOT FOUND 🡪 404 (Não Encontrado!). O Método build() constrói a Resposta com o HTTP Status definido.
Depois de Criar o Método, observe que foram importados mais 2 pacotes, como mostra a imagem abaixo (Setas vermelhas):
Para concluir, não esqueça de Salvar o código (File 🡪 Save All) e verificar se o Projeto está em execução.
Agora vamos criar a Requisição para o Método getById():
- Clique com o botão direito do mouse sobre a Pasta Postagem para abrir o menu e clique na opção New HTTP Request.
-
Será criada uma nova Requisição (New Request) dentro da pasta Postagem.
-
Dê um duplo clique sobre a nova requisição (New Request), informe o nome da requisição (indicado na imagem abaixo na cor amarela) e pressione a tecla enter do seu teclado.
- Selecione o Método HTTP que será utilizado (GET) na requisição, indicado na imagem abaixo na cor verde.
- Configure a requisição conforme a imagem abaixo:
- No item marcado em amarelo na imagem acima, informe o endereço (endpoint) da Requisição. A requisição Consultar postagem por ID foi configurada da seguinte maneira:
- A primeira parte do endereço (http://localhost:8080) é o endereço do nosso servidor local. Quando a API estiver na nuvem, ele será substituído pelo endereço da aplicação na nuvem.
- A segunda parte do endereço é o Endpoint configurado na anotação @RequestMapping, em nosso caso /postagens.
- A terceira parte (/1) é a variável de caminho (@PathVariable) id. Informe o id que você deseja procurar.
-
Para testar a requisição, com a aplicação rodando, clique no botão
.
-
O resultado da requisição você confere na imagem abaixo:
-
Observe que a aplicação quando encontra o Objeto no Banco de dados, além de exibir os dados do Objeto no Corpo da Resposta, respeitando o critério informado na consulta (id 1), ela também retorna um HTTP Status 200 🡪 OK (indicado em verde na imagem acima), informando que a Requisição foi bem sucedida!
-
Caso o Objeto Postagem não seja encontrado, a aplicação retornará o HTTP Status 404 🡪 NOT FOUND (Não encontrado), marcado em laranja na imagem abaixo:
- Caso o Projeto Spring não esteja em Execução, o Insomnia retornará a mensagem abaixo:
- Execute o seu Projeto e teste novamente!