Я пишу простой перехватчик, который будет собирать данные обо всех запросах и ответах, которые я получаю и отправляю, и направляет их во внешнюю очередь, где я могу отфильтровать это и посмотреть, что у меня было: 100 вызовов в / test, 95 завершено со статусом 200, 4 закончили со статусом 400, 1 закончили со статусом 500
Я написал класс, который выглядит так
@Component
public class HttpEventInterceptor extends HandlerInterceptorAdapter {
private final HttpEventStream eventStream;
private final ObjectMapper objectMapper;
public HttpEventInterceptor(HttpEventStream eventStream) {
this.eventStream = eventStream;
this.objectMapper = new ObjectMapper();
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
final var eventJson = objectMapper.writeValueAsString(createHttpEvent(request, response));
eventStream.outboundEvents().send(MessageBuilder
.withPayload(eventJson)
.setHeader(MessageHeaders.CONTENT_TYPE, MimeTypeUtils.APPLICATION_JSON)
.build());
}
private HttpEvent createHttpEvent(HttpServletRequest request, HttpServletResponse response) {
final var event = new HttpEvent();
event.setTimestamp(System.currentTimeMillis());
event.setMethod(request.getMethod());
event.setUrl(request.getRequestURI()); // <-- This isn't working as expected
event.setResponseCode(response.getStatus());
return event;
}
}
Кажется, все работает нормально, кроме одной вещи. Допустим, я вызываю конечную точку / тест с неверным запросом и получаю HttpStatus 400 Bad Request, как и ожидалось. Но в этот момент request.getRequestURI()
, вызванный createHttpEvent()
, не возвращает / test, а / error. Как мне достичь исходной конечной точки?
Я тоже пытался @Override
preHandle()
, но это то же самое, также мне нужно объединить данные из запроса и ответа, поэтому я бы предпочел сделать это в postHandle()
.