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()) — byte-idêntico ao comportamento anterior. 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 (constituição engenharia/java-micronaut §Erros: "mensagem ao cliente × log interno").
Antes cada app reimplementava o log num @ExceptionHandler dedicado e, ao migrar para o
seam PortadoraDeProblema, esse log — junto do 5xx→Sentry — se perdia. Aqui 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 — restaura o 5xx→Bugsink sem código no app. - 4xx (e demais < 500) em nível
DEBUG, sem stacktrace — erro de cliente, esperado e ruidoso (404, validação); não polui o log de produção.
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>
-