Возврат 404, когда поток пуст - PullRequest
0 голосов
/ 22 ноября 2018

Я пытаюсь вернуть 404, когда Flux пуст, как здесь: Функциональность WebFlux: как обнаружить пустой Flux и вернуть 404?

Моя главная проблема заключается в том, чтоКогда вы проверяете, есть ли у потока элементы, он выделяет это значение, а вы его теряете.И когда я пытаюсь использовать переключатель, если он пуст в ответе сервера, он никогда не вызывается (я тайно думаю, что это потому, что Mono не пуст, только тело пусто).

Некоторый код того, что я делаю(У меня есть фильтр в моем классе маршрутизатора, проверяющий наличие DataNotFoundException для возврата notFound):

Flux<Location> response = this.locationService.searchLocations(searchFields, pageToken);
return ok()
        .contentType(APPLICATION_STREAM_JSON)
        .body(response, Location.class)
        .switchIfEmpty(Mono.error(new DataNotFoundException("The data you seek is not here.")));

^ Это никогда не вызывает switchIfEmpty

Flux<Location> response = this.locationService.searchLocations(searchFields, pageToken);

return response.hasElements().flatMap(l ->{
   if(l){
       return ok()
               .contentType(APPLICATION_STREAM_JSON)
               .body(response, Location.class);
   } 
   else{
       return Mono.error(new DataNotFoundException("The data you seek is not here."));
   }
});

^ Это теряет испущенный элемент на hasElements.

Есть ли способ восстановить испущенный элемент в hasElements или заставить switchIfEmpty только проверять содержимое тела?

Ответы [ 2 ]

0 голосов
/ 26 ноября 2018

То, что написал Александр, правильно.Вы вызываете switchIfEmpty для объекта, который никогда не бывает пустым ServerResponse.ok() по определению не является пустым издателем.Мне нравится обрабатывать эти случаи в обратном порядке, поэтому вызывайте службу и затем объединяйте все методы, которые создают ответ.

    this.locationService.searchLocations(searchFields, pageToken)
            .buffer()
            .map(t -> ResponseEntity.ok(t))
            .defaultIfEmpty(ResponseEntity.notFound().build());

ОБНОВЛЕНИЕ (не уверен, что это работает, но попробуйте):

 public Mono<ServerResponse> myRestMethod(ServerRequest serverRequest) {
        return serverRequest.bodyToMono(RequestDTO.class)
                .map((request) -> searchLocations(request.searchFields, request.pageToken))
                .flatMap( t -> ServerResponse
                        .ok()
                        .body(t, ResponseDTO.class)
                )
                .switchIfEmpty(ServerResponse.notFound().build())
                ;
    }
0 голосов
/ 23 ноября 2018

Вы можете применить оператор switchIfEmpty к вашему Flux<Location> response.

Flux<Location> response = this.locationService
        .searchLocations(searchFields, pageToken)
        .switchIfEmpty(Mono.error(new DataNotFoundException("The data you seek is not here.")));
...