#spring-webflux #spring-filter
Вопрос:
У меня есть созданный фильтр, в котором я получаю доступ к телу полезной нагрузки и выполняю некоторую логику (на данный момент, скажем, я регистрирую тело). На последнем шаге я возвращаю Mono, но когда запрос проходит через контроллер к службам, он выдает плохую ошибку запроса, что тело отсутствует.
Код для фильтра:
public Mono<Void> filter(ServerWebExchange serverWebExchange, WebFilterChain webFilterChain) {
HttpHeaders headers = serverWebExchange.getRequest().getHeaders();
String domain = headers.getFirst("domain");
return serverWebExchange.getRequest().getBody()
.single()
.flatMap(body -> Mono.just(parseBody(body)))
.flatMap(s -> webFilterChain.filter(serverWebExchange));
}
private String parseBody(DataBuffer fbody) {
System.out.println("parsing body");
ByteArrayOutputStream baos = null;
try {
baos = new ByteArrayOutputStream();
Channels.newChannel(baos).write(fbody.asByteBuffer().asReadOnlyBuffer());
} catch (IOException e) {
e.printStackTrace();
}
return baos.toString(StandardCharsets.UTF_8);
}
Ошибка: org.springframework.web.server.Исключение ServerWebInputException: 400 BAD_REQUEST «Тело запроса отсутствует»
Что может вызвать такое поведение?
Комментарии:
1. Вы пробовали отлаживать свой код прямо перед оператором return в методе filter ()? Вы должны иметь возможность просматривать данные, доступные в serverWebExchange. Это может быть отправной точкой для определения того, получает ли сервер какие-либо данные в теле запроса.
2. @NicodemusOjwee Я думаю, что эта строка плоская карта(s -> цепочка веб-фильтров. фильтр(serverWebExchange)) вызывает это, так как я удалил все и все равно выдает ту же ошибку. удаление из flatmap и выполнение в качестве цепочки веб-фильтров возврата. фильтр(serverWebExchange) работает