Aula 10 — Aula estúdio: API de locação de equipamentos¶
Nesta aula
- Formato: aula estúdio. Você resolve os exercícios do professor, que estão na página Exercícios.
- Você pratica: construir uma API completa, com erros tratados e autenticação.
- Você usa como base: tudo o que a biblioteca ganhou das aulas 05 a 09.
- Resolução:
aula-10/equipamento, para comparar depois de tentar.
Como funciona esta aula¶
Esta é uma aula estúdio. Você constrói uma API inteira, do zero, juntando tudo o que a biblioteca ganhou das aulas 05 a 09: rotas, services, injeção de dependência, tratamento de erros e autenticação.
O sistema é uma locadora de equipamentos, com clientes, equipamentos e locações.
Antes de começar¶
Crie um projeto em start.spring.io, como no Passo 1 da Aula 05, e acrescente a dependência Spring Security além de Spring Web.
Cada requisito do enunciado corresponde a algo que você já fez:
| O enunciado pede | Você já fez igual em |
|---|---|
| Rotas para criar, listar e buscar | EditoraController, na Aula 05 |
| Uma entidade ligada a outras duas | LivroService.criar, na Aula 06 |
| Campos obrigatórios | A validação do nome em EditoraService.criar, na Aula 08 |
| Responder 404 quando não encontra | EditoraNaoEncontradaException e o tratador, na Aula 08 |
| Rotas autenticadas, com uma exceção aberta | SecurityConfig, na Aula 09 |
Duas coisas são novas: a rota de editar e a exclusão lógica. As dicas abaixo tratam das duas.
Um caminho para resolver¶
1. Comece sem segurança. Deixe a dependência do Spring Security para o fim. Testar com tudo trancado atrapalha no começo.
2. Faça o cliente completo. Classe, service e controller, com as cinco rotas, e teste. O cliente não depende de ninguém.
3. Repita para o equipamento. O desenho é o mesmo, então vai mais rápido.
4. Faça a locação por último. Ela precisa dos dois services anteriores, recebidos com @Autowired.
5. Acrescente as validações e os erros. Uma exceção para "campo inválido" e uma para "não encontrado", com os tratadores.
6. Tranque a API. Acrescente a dependência, o SecurityConfig e o cadastro de usuários da Aula 09, liberando só a listagem de equipamentos.
Pontos que costumam travar¶
A rota de editar
Use @PutMapping("/clientes/{id}"), com dois parâmetros no método: o identificador, com @PathVariable, e os dados novos, com @RequestBody. No service, busque o objeto guardado e troque os atributos pelos valores recebidos.
Exclusão lógica
Na exclusão lógica, o registro não sai do HashMap. A classe ganha um atributo boolean deleted, e excluir significa mudar esse atributo para true.
O trabalho está em fazer o resto do sistema respeitar isso: a listagem pula quem está excluído, e a busca trata um registro excluído como se ele não existisse. Se você concentrar essa verificação no método de buscar do service, e os outros métodos sempre passarem por ele, a regra fica em um lugar só.
Escolher o equipamento da locação
O cliente vem no corpo da requisição, mas o equipamento é o sistema que escolhe. Crie no service de equipamentos um método que percorre os equipamentos e devolve o primeiro que esteja disponível e não excluído. Depois de escolhido, marque-o como indisponível. Decida também o que acontece quando não há nenhum.
O equipamento nasce disponível?
Um atributo boolean que ninguém preenche vale false. Se o JSON de cadastro não trouxer o campo disponivel, o equipamento nasce indisponível e nenhuma locação consegue usá-lo. Você viu o mesmo efeito com o livro2, na Aula 02. Decida se o cadastro deve exigir o campo ou se o equipamento deve nascer disponível.
Datas no JSON
Para dataInicio e dataFim, use o tipo LocalDate. No JSON, a data vai como texto, no formato "2026-09-20".
Liberar só a listagem de equipamentos
No SecurityConfig, a regra leva o verbo e o endereço: requestMatchers(HttpMethod.GET, "/equipamentos").permitAll(). Assim, listar fica aberto, e cadastrar um equipamento, que usa POST no mesmo endereço, continua protegido.
Depois de tentar¶
O repositório tem uma resolução completa, na pasta aula-10/equipamento. Use-a para comparar com a sua, e não como ponto de partida. Ela traz também uma coleção do Postman, com uma requisição pronta para cada rota.
Para conferir a sua solução contra o enunciado:
- as três entidades têm rotas para criar, listar, buscar, editar e excluir;
- um registro excluído não aparece na listagem, e buscá-lo responde
404; - cadastrar com um campo faltando responde
400, com uma mensagem; - criar uma locação escolhe um equipamento sozinho, e esse equipamento deixa de estar disponível;
- sem usuário e senha, só a listagem de equipamentos responde; o resto dá
401.