Переопределить не найденный обработчик исключений в micronaut

#java #netty #micronaut

Вопрос:

Я пытаюсь переопределить обработчик not-found исключений в micronaut.

Я хочу создать свой собственный формат ошибок, но не могу найти, какой обработчик исключений я должен заменить.

Моя текущая реализация:

 @Produces
@Singleton
@Requires(classes = {Exception.class, ExceptionHandler.class})
//@Replaces(NotFoundExceptionHandler.class)
public class MyNotFoundExceptionHandler implements ExceptionHandler<Exception, HttpResponse<?>> {
    
    @Override
    public HttpResponse<?> handle(HttpRequest request, Exception exception) {
        return HttpResponse.notFound();
    }

}
 

Обработчик исключений micronaut по умолчанию выдает этот формат на not-found :

 {
    "message": "Page Not Found",
    "_links": {
        "self": {
            "href": "/api/not-found",
            "templated": false
        }
    }
}
 

Я уже переопределил другие обработчики исключений по умолчанию, такие как ConstraintExceptionHandler и UnsatisfiedRouteHandler , но для not-found регистратора исключение не выводится в консоли:

 20:43:23.863 [default-nioEventLoopGroup-1-5] DEBUG i.m.h.s.netty.RoutingInBoundHandler - Request GET /api/not-found
20:43:23.864 [default-nioEventLoopGroup-1-5] DEBUG i.m.h.s.netty.RoutingInBoundHandler - No matching route: GET /api/not-found
20:43:23.864 [default-nioEventLoopGroup-1-5] DEBUG i.m.web.router.RouteMatchUtils - Route match attribute for request (/api/not-found) not found
 

Кто-нибудь знает, какой обработчик исключений следует переопределить?

Ответ №1:

вы можете найти то, что ищете, здесь https://guides.micronaut.io/latest/micronaut-error-handling-maven-java.html#global-error

С этим кодом в любом контроллере у вас все должно быть в порядке:

 @Error(status = HttpStatus.NOT_FOUND, global = true)
fun notFoundHandler(request: HttpRequest<*>): HttpResponse<JsonError> {
    return HttpResponse.status<JsonError>(HttpStatus.NOT_FOUND).body(JsonError("Page '$request' Not Found"))
}