Как мне выполнить операции, которые имеют побочные эффекты в ответ на пустой поток?Например, чтобы обработать случай, когда клиент отправляет пустое тело, и мы читаем его с .bodyToMono(...)
.
См., Например:
public Mono<ServerResponse> createEventDetails(ServerRequest request) {
return request.principal().flatMap(principal -> {
UserProfile userProfile = (UserProfile) ((UsernamePasswordAuthenticationToken) principal).getCredentials();
final String id = request.pathVariable("id");
final UUID eventId = UUID.fromString(id);
return request.bodyToMono(CreateEventDetailsRequest.class)
.map(body -> new CreateEventDetailsCommand(eventId, userProfile, body.getObjectId(), body.getDocumentUrls()))
.flatMap(command -> {
createEventDetailsCommandHandler.handle(command);
return ServerResponse
.created(URI.create(eventId.toString()))
.body(BodyInserters.fromObject(new CreateEventDetailsResponse(eventId)));
})
.switchIfEmpty(ServerResponse.badRequest().syncBody(new Error("missing request body for event id: " + id)))
.map(response -> {
LOG.error("POST createEventDetails: missing request body for event id: " + id);
return response;
});
});
}
Возвращает желаемый 400 ответ вслучай, когда клиент пропускает тело запроса, но сообщение журнала всегда печатается, даже для успешных запросов.
Моя лучшая догадка относительно того, почему это происходит, заключается в том, что .switchIfEmpty(...).map(...)
выполняется как одна единицарамки, а затем результат игнорируется.
Как мне справиться с этим делом?