Class UnifiedErrorResponseProcessor
- All Implemented Interfaces:
io.micronaut.http.server.exceptions.response.ErrorResponseProcessor<ProblemDetail>
ProblemDetail,
application/problem+json), substituindo o HateoasErrorResponseProcessor default
(que emitia {message, _links, _embedded}). É o padrão de erro da casa.
Atua no ponto único por onde o Micronaut renderiza erros gerados pelo framework:
HttpStatusException (e a hierarquia de exceção desta lib), falhas de validação
(Bean Validation), 404 de rota e erros de parse de corpo.
Honra a taxonomia de domínio da causa-raiz. Lê context.getRootCause(): quando a
exceção é uma PortadoraDeProblema, carimba o code de máquina e o title de
tipo que ela carrega; na ausência, cai no genérico (code = status.name(),
title = status.getReason()). O title é
do tipo do problema (estável, RFC 9457 §3.1.4); o específico da ocorrência fica no detail.
Falha de Bean Validation (ConstraintViolationException) recebe code uniforme
(status.name(), ex. BAD_REQUEST — o mesmo de BadRequestException, para o
consumidor não distinguir borda×service) mais a lista de campos rejeitados em invalid-params.
Ordem de decisão: portadora → validação → genérico.
O status HTTP já vem definido na resposta quando este processor roda — apenas formatamos o corpo, sem alterar o status (preserva os contratos testados de cada app).
Log estruturado (policy da casa)
Ponto único por onde todo erro renderizado da API passa — logo, o lugar da policy de log da
casa (engenharia/java-micronaut, Erros: "mensagem ao cliente × log interno"). O log é
incondicional (não é opt-in): emite uma linha por erro — método caminho ->
status code lendo context.getRequest():
- 5xx em nível
ERRORcom a causa-raiz (stacktrace). É o nível que oSentryAppenderdo logback captura — leva o 5xx ao Bugsink sem código no app. - 404 de rota não casada numa requisição autenticada em nível
ERROR(glitcha). Cliente que manda credencial acreditava que a rota existe — 404 nele é bug, não ruído: é o sintoma do controller que o native-image não registrou (reachability/AOT), com a rota funcionando na JVM. VerrotaCasada(HttpRequest)eautenticado(HttpRequest). - Demais 4xx — o 404 anônimo (scanner batendo
/.env,/wp/...) e o 404 de negócio (handler que casou a rota e não achou o recurso: placa, id, slug) — em nívelDEBUG, sem stacktrace: erro de cliente, esperado e ruidoso (validação, 401/403, varredura, chave digitada errado); não polui o log de produção nem o GlitchTip.
A linha não carrega corpo, query-string, headers nem o detail — só verbo, caminho,
status e o code de máquina, minimizando exposição de PII no log.
-
Constructor Summary
Constructors -
Method Summary
Modifier and TypeMethodDescriptionio.micronaut.http.MutableHttpResponse<ProblemDetail> processResponse(io.micronaut.http.server.exceptions.response.ErrorContext context, io.micronaut.http.MutableHttpResponse<?> response)
-
Constructor Details
-
UnifiedErrorResponseProcessor
public UnifiedErrorResponseProcessor()
-
-
Method Details
-
processResponse
public io.micronaut.http.MutableHttpResponse<ProblemDetail> processResponse(io.micronaut.http.server.exceptions.response.ErrorContext context, io.micronaut.http.MutableHttpResponse<?> response) - Specified by:
processResponsein interfaceio.micronaut.http.server.exceptions.response.ErrorResponseProcessor<ProblemDetail>
-