Как правильно обрабатывать случай, когда поток пуст - PullRequest
0 голосов
/ 03 октября 2018

Как мне выполнить операции, которые имеют побочные эффекты в ответ на пустой поток?Например, чтобы обработать случай, когда клиент отправляет пустое тело, и мы читаем его с .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(...) выполняется как одна единицарамки, а затем результат игнорируется.

Как мне справиться с этим делом?

1 Ответ

0 голосов
/ 04 октября 2018

Есть несколько способов сделать это.В приведенном выше случае вы можете просто добавить запись в журнал на коммутаторе, например,

.switchIfEmpty(ServerResponse.badRequest().syncBody(new Error("missing request body for event id: " + id))
       .doOnNext(errorResponse -> LOG.error("POST createEventDetails: missing request body for event id: " + id)
)

. Другим подходом может быть отправка сигнала об ошибке обратно в ваш обработчик, который перехватывает и регистрирует его.Вы можете посмотреть здесь https://www.baeldung.com/spring-webflux-errors Некоторое легкое чтение можно найти здесь https://docs.spring.io/spring-framework/docs/5.0.0.BUILD-SNAPSHOT/javadoc-api/org/springframework/web/server/WebHandler.html

Используйте HttpWebHandlerAdapter для адаптации WebHandler к HttpHandler.WebHttpHandlerBuilder предоставляет удобный способ сделать это, а также дополнительно настраивать один или несколько фильтров и / или обработчиков исключений.

Образец обработчика можно просмотреть в ResponseStatusExceptionHandler

...