Escolar Documentos
Profissional Documentos
Cultura Documentos
Ambiente:
- IDE com suporte a Java (IntelliJ Community Edition, Eclipse etc.)
- Java JDK 11+
O desafio 🚀
Desta vez, iremos fazer uma dinâmica diferente para o challenge do mês. Abaixo, vocês
encontrarão uma lista de exercícios, pequenos desafios na verdade, que ao final, resultarão no
desenvolvimento de uma API! Que é a proposta do desafio do mês.
Dito isso, não deixe de percorrer cada etapa e estudar as ferramentas necessárias para cumprir o
desafio final.
Questão 1.
Desenvolvimento do primeiro endpoint utilizando Spring Boot:
A Ada precisa de uma API para armazenar os filmes preferidos por seus alunos. Neste momento,
nós precisamos armazenar o nome e a descrição destes filmes. Também seria interessante que
cada filme tivesse um identificador próprio e que fosse possível saber quando aquele filme foi
registrado. Foi solicitado também que esta API fosse criada utilizando-se Java e Spring Boot, pois
é uma das tecnologias de referência dentro da Ada.
Vamos começar criando um endpoint de referência em nossa API. Este endpoint será utilizado
somente para testarmos se conseguiremos ter uma API que consegue responder dentro de
nosso ambiente. Para isso, crie um endpoint em uma API utilizando o Spring Boot na rota
“/test/hello”. Este endpoint deve devolver somente uma string com o texto “Hello, World!”
Este primeiro exercício tem como objetivo habilitar os participantes a ter os primeiros contatos
com o Spring Boot. Além disso, ele também tem como objetivo fazer com que os participantes
entendam a maneira como controllers e rotas são gerenciadas quando
utilizamos as estruturas do Spring Web.
Questão 2.
Desenvolvimento de endpoint com parâmetros baseados em rotas:
Este exercício tem como objetivo habilitar os participantes a serem capazes de criar rotas
parametrizadas e dinâmicas utilizando o Spring Web.
Questão 3.
Desenvolvimento de endpoint baseado em payloads:
Também precisamos validar se nossa API é também capaz de receber parâmetros que são
informados no corpo da requisição. Por isso, crie um endpoint que, na rota “/test/hello/body” e ao
receber um objeto com um atributo chamado “name”, seja capaz de responder um objeto
contendo um atributo chamado “message” com o conteúdo “Hello, {{name}}!” e a data/hora
quando a requisição foi processada. Por exemplo: se a rota “/test/hello/body” receber o objeto
abaixo…
{
“name”: “Ada”
}
{
“message”: “Hello, Ada!”,
“processedAt”: “2022-08-30T06:00:00”
}
Neste desafio, os alunos precisarão começar a lidar com requisições
utilizando o verbo HTTP POST, além de lidarem com a annotation
@RequestBody. Provavelmente, também precisarão começar a explorar
configurações de serialização ou das APIs de data e hora do Java
Questão 4.
Gerenciamento de bancos de dados através de migrations:
Questão 5.
Manipulação de bancos de dados através do Spring Data JDBC - escrita
Neste momento, sabemos criar endpoints e também já conseguimos gerenciar o nosso banco de
dados de maneira automatizada através da própria aplicação. Chegou a hora de criarmos a
funcionalidade de inserção de filmes em nossa base.
Crie um endpoint que, recebendo um objeto que representa um filme com seu nome e descrição,
seja capaz de armazenar estas informações em nossa base de dados H2. Como estamos
utilizando Spring, será que já não existe alguma biblioteca que nos ajude a manipular bancos de
dados através de comandos SQL dentro do ecossistema?
Neste momento, é esperado que os alunos tenham os primeiros contatos com o Spring Data
JDBC. Eles deverão ser capazes de utilizar classes como a NamedParameterJdbcTemplate para
escrever a consulta SQL necessária para realizar o INSERT das informações do filme na base de
dados. Aqui, também devem surgir discussões sobre o correto status
Questão 6.
Manipulação de bancos de dados através do Spring Data JDBC - leitura:
Agora que nossa API já é capaz de registrar filmes, crie um endpoint que
retorne a lista de filmes cadastrados. Crie também um endpoint que,
dado um ID de filme informado na rota, devolva somente o filme com o
ID informado.
Ainda explorando o Spring Data JDBC, os participantes deverão conseguir utilizar a estrutura
de RowMapper para conseguirem, a partir de um SELECT no banco de dados, transformar as
informações em objetos que representam filmes e, em seguida, devolver estes objetos como
resposta do endpoint.
Questão 7.
Documentação de APIs REST com Swagger/OpenAPI :
Neste momento, temos uma API que é capaz de registrar e listar filmes. Porém, como
poderíamos criar uma documentação automatizada de nossa API, permitindo a qualquer
pessoa com acesso facilmente verificar informações sobre endpoints existentes e o formato dos
possíveis responses?
Neste momento, os alunos deverão lidar com documentação de APIs, um tópico muito
recorrente no mercado. É esperado que eles comecem a explorar ferramentas como Swagger,
OpenAPI e SpringDoc.
Questão 8.
Gerenciamento de exceptions com advices:
Temos agora uma regra de negócio em nossa API: não podemos permitir que filmes com o
mesmo título sejam cadastrados. Caso já exista um filme com o mesmo título no momento em
que um cadastro de filme for solicitado, nossa aplicação deverá arremessar uma exceção. Esta
exceção precisa ser serializada para uma mensagem de erro amigável para quem estiver
consumindo nossa API.
Este desafio tem como objetivo provocar aos participantes o
conhecimento de estratégias de design de código (como service layer) e
pensar em maneiras automatizadas de mapeamento de exceções para
responses adequados. No Spring, isso é feito através de advices.
Questão 9.
Evitando NullPointerException com optionals:
Questão 10.
Melhorando a experiência de troubleshooting com logs:
Neste momento, temos uma API completamente funcional e que atende aos nossos requisitos
de negócio, ao mesmo tempo que está devidamente documentada. Porém, mesmo assim, erros
podem acontecer durante a execução do nosso código. Por exemplo: um filme pode não ser
encontrado quando um ID inexistente for informado. Como podemos rastrear o fluxo de
execução de nossa aplicação? Dessa maneira, seria mais fácil identificar situações de erro em
nossa aplicação, mesmo posteriormente… Será que conseguiríamos criar um log de execução de
nossa aplicação?
Este desafio pressupõe que os alunos comecem a explorar conceitos de logging em aplicações
Java, utilizando bibliotecas como SLF4j e Logback.