В настоящее время разрабатывается с помощью Spring Boot 2.0.4 веб-фильтр, который регистрирует HTTP-запросы и информацию об ответах (URL, код состояния ответа, продолжительность и т. Д.) В приложении Spring WebFlux.
Работает нормально, за исключением этого exchange.getResponse (). getStatusCode () остается нулевым Второй:
Mono<Void> filtered = chain.filter(exchange);
exchange.getResponse().beforeCommit(() -> {
System.out.println("Status=" + exchange.getResponse().getStatusCode());
return Mono.empty();
});
return filtered;
Также пробовал различные заказы на фильтре: нет, @Order (100000), @Order (-100000).
Код состояния остается нулевым.
Какая правильная реализация?
Обновление 1
Написал минималистичный рабочий пример на основе решения KevH, см. https://github.com/fbeaufume/webflux-filter-sample, но этоеще не работает, статус все еще нулевой.MWE предоставляет две конечные точки REST: / hello и / pause / 1000 (пауза в 1 секунду).
Обратите внимание, что при вызове журналов конечной точки паузы:
11:06:20.644 INFO 9536 --- [ctor-http-nio-2] com.adeliosys.sample.LogFilter : Request [/pause/1000] started, traceId [bb3fe67d-170b-4070-837d-816fe1420a1f]
11:06:20.673 INFO 9536 --- [ctor-http-nio-2] com.adeliosys.sample.HelloController : Pausing for 1000 msec
11:06:21.683 INFO 9536 --- [ parallel-2] com.adeliosys.sample.LogFilter : Request [/pause/1000] completed, statusCode [null], time [1039], traceId [bb3fe67d-170b-4070-837d-816fe1420a1f]
11:06:21.684 INFO 9536 --- [ parallel-2] com.adeliosys.sample.HelloController : Paused for 1000 msec
Я удивлен, чтовторое сообщение фильтра отображается перед вторым сообщением конечной точки.
обновление 2
Кажется, что реализация фильтра использует doAfterTerminate(или аналогичные методы) были правильными, но это корректно возвращает статус ответа HTTP только с методами контроллера REST, которые используют ResponseEntity в типе возврата.
Не поддерживается(т. е. статус равен нулю): void
, Mono<Void>
, String
, Mono<String>
, MyBean
, Mono<MyBean>
и т. д.
Поддерживается (т. е. статус 200): ReponseEntity<Void>
, Mono<ResponseEntity<Void>>
, ReponseEntity<String>
, Mono<ResponseEntity<String>>
, ReponseEntity<MyBean>
, Mono<ResponseEntity<MyBean>>
и т. Д.
Ошибка?
Spring Boot 2.0.5 работает аналогично.
Обновление 3
Открыл вопрос по теме, см. https://jira.spring.io/browse/SPR-17368