Как подключиться к серверу micronaut при обработке ошибок с помощью фильтра? - PullRequest
0 голосов
/ 03 августа 2020

Для любого ответа 4xx или 5xx, выданного моим сервером micronaut, я хотел бы зарегистрировать код состояния ответа и конечную точку, на которую он нацелен. Похоже, фильтр был бы хорошим местом для этого, но я не могу понять, как подключить к обработке onError

, например, только этот фильтр

@Filter("/**")
class RequestLoggerFilter: OncePerRequestHttpServerFilter() {
  companion object {
    private val log = LogManager.getLogger(RequestLoggerFilter::class.java)
  }

  override fun doFilterOnce(request: HttpRequest<*>, chain: ServerFilterChain): Publisher<MutableHttpResponse<*>>? {
    return Publishers.then(chain.proceed(request), ResponseLogger(request))
  }

  class ResponseLogger(private val request: HttpRequest<*>): Consumer<MutableHttpResponse<*>> {
    override fun accept(response: MutableHttpResponse<*>) {
      log.info("Status: ${response.status.code} Endpoint: ${request.path}")
    }
  }
}

регистрирует успешный ответ, а не ответы 4xx или 5xx. Как мне заставить это подключиться к обработке onError?

1 Ответ

0 голосов
/ 08 августа 2020

Вы можете сделать следующее. Создайте собственное ApplicationException (расширяет RuntimeException), там вы можете обрабатывать ошибки приложения и, в частности, то, как они приводят к кодам ошибок http. Ваше исключение также может содержать код состояния.

Пример:

class BadRequestException extends ApplicationException {
 
    public HttpStatus getStatus() {
        return HttpStatus.BAD_REQUEST;
    }
}

У вас может быть несколько таких ExceptionHandler для разных целей.

@Slf4j
@Produces
@Singleton
@Requires(classes = {ApplicationException.class, ExceptionHandler.class})
public class ApplicationExceptionHandler implements ExceptionHandler<ApplicationException, HttpResponse> {

    @Override
    public HttpResponse handle(final HttpRequest request, final ApplicationException exception) {
        log.error("Application exception message={}, cause={}", exception.getMessage(), exception.getCause());
        final String message = exception.getMessage();
        final String code = exception.getClass().getSimpleName();
        final ErrorCode error = new ErrorCode(message, code);

        log.info("Status: ${exception.getStatus())} Endpoint: ${request.path}")

        return HttpResponse.status(exception.getStatus()).body(error);
    }
}
...