Série: Recolocação e teste prático Java

Episódio 06: A porta de entrada da API: controllers simples, validação e documentação viva

Episódio 06: Camada Web

A parte mais visível — e perigosa

A camada Web atrai responsabilidade porque é onde todo mundo testa. O PDF da jornada de recolocação foi claro: controllers sem lógica de negócio, validação de contrato na borda, delegação à aplicação.

Na visão geral, cliente e Swagger exercitam a mesma porta HTTP — contrato visível antes de Postman obrigatório:

Visão geral
Cliente + Swagger UI API de veículos
(HTTP)

Quem testa não precisa de Postman obrigatório se o Swagger estiver vivo e correto.

O problema por trás da etapa

O controller de veículos expõe cadastrar, atualizar, consultar por id, listar com paginação e remover. Recebe requests, aplica @Valid, chama o service e devolve status adequados: 201 em criação, 200 em leitura/atualização, 204 em remoção quando fizer sentido, 400 em validação, 404 em ausência.

DTOs de entrada carregam Bean Validation; falhas viram HTTP 400 com corpo padronizado via @RestControllerAdvice — menos duplicação, melhor experiência para quem exercita a API no Swagger.

Na borda Web, blocos técnicos separam controller fino, validação, handler global e springdoc:

Componentes da solução
VeiculoController
@RestController
DTOs + @Valid
contrato entrada
ApiExceptionHandler
@RestControllerAdvice
OpenAPI config
springdoc

Erro 400/404 padronizado: handler global evita try/catch em cada método.

A decisão técnica

Handler global trata validação, veículo não encontrado (404) e eventual 500 sem vazar stack interno. springdoc-openapi descreve parâmetros de paginação, modelos e códigos; a meta é abrir o Swagger e entender o contrato em minutos.

Swagger UI e Spring MVC partilham o mesmo deployável — blocos de execução na cabeça de quem testa:

O que corre na máquina
Swagger UI
(estático / gerado)
Spring MVC
(Tomcat embutido)

Documentação e runtime partilham o mesmo artefacto deployável do teste.

Implementando com critério

Método de cadastro com forma mental fixa: receber request, chamar aplicação, montar response/URI, retornar. Se o método passa a checar marca, mexer em entidade ou acessar repository direto, algo escapou da camada certa.

Teste manual: feliz + erros (campo obrigatório, valor negativo, id inexistente). Documentação visualmente revisada — quebrada ou confusa passa impressão de acabamento incompleto mesmo com código ok.

Na organização do código, verbo HTTP, DTO, delegação ao service e códigos de estado fecham a leitura vertical:

Detalhe no código
POST/GET/PUT/DELETE
/veiculos
CriarVeiculoRequest VeiculoControllerVeiculoService Respostas
201 / 200 / 204 / 400 / 404

O avaliador segue o fio: anotações de mapeamento, DTOs e delegação numa única leitura vertical.

Fechamento da etapa

Com endpoints completos e Swagger navegável, falta consolidar entrega: manual de arranque em README.md, checklist e narrativa curta para a banca — tema do fechamento da série.

Como defender essa etapa

Web como contrato público: HTTP, status e documentação; inteligência mora na Application. Padronizar erros atende explicitamente o pedido de 400 com mensagens apropriadas.

Reflexão final: Controller discreto é prova silenciosa de que as camadas anteriores fizeram o trabalho.


Nota: Cenário anonimizado; série de insights técnicos reutilizáveis.

Christian Mulato
Engenheiro Construtor

© 2026 Christian Mulato. Todos os direitos reservados.