Карта Микронавта пуста Текучий до 404 - PullRequest
0 голосов
/ 04 июня 2019

Учитывая: У меня есть служба, которая производит Flowable<T>.Это Flowable<T> может быть пустым.

У меня есть контроллер, который выглядит примерно так:

@Controller("/api}")
class ApiController constructor( private val myService: MyService) {
    @Get("/")
    @Produces(MediaType.APPLICATION_JSON)
    fun getSomething(): Flowable<T> {
        return myService.get()
    }
}

Чего я хочу достичь: когда текучий объект пуст -> бросить HttpStatusException(404).

В противном случае вернуть потоковое с данными внутри.

То, что я уже пробовал

Я пробовал различные комбинации следующих операторов RxJava:

  1. doOnError
  2. onErrorResumeNext
  3. onErrorReturn
  4. switchIfEmpty
  5. ...

Что я испытал

Ни один из вариантов не выдал 404 в Браузере / Почтальоне.

Несколько вариантов просто ничего не делают.Это означает, что страница не загружается в браузере.

Другие параметры - это создание "OK" (200) ответов с пустыми телами.

А некоторые - CompositeException ...

У кого-нибудь есть подсказка для меня?

Обновление : как предложено:

@Controller("/api")
class HelloController {
    @Get("/")
    @Produces(MediaType.APPLICATION_JSON)
    fun get(): Flowable<String> {
        return Flowable.empty<String>()
                .switchIfEmpty {
            it.onError(HttpStatusException(HttpStatus.NOT_FOUND,""))
        }
    }
}

При вызове я получаю следующеес firefox:

HttpResponseStatus: 200
HttpContent: [
Yes, the closing bracet is missing!

Ответы [ 2 ]

0 голосов
/ 07 июня 2019

Возможное решение состоит в том, чтобы использовать Maybe вместо Flowable.

@Controller("/api")
class HelloController {
    @Get("/")
    @Produces(MediaType.APPLICATION_JSON)
    fun get(): Maybe<String> {
        return Flowable.empty<String>()
            .toList()
            .flatMapMaybe { x ->
                if (x.size == 0)
                    Maybe.empty<String>()
                else
                    Maybe.just(x)
            }           
        }
    }
}

Это не лучшее решение, но рабочее.

0 голосов
/ 04 июня 2019

Я не знаю, Микронавт, но я думаю, что это может быть то, что вы хотите:

Flowable.empty<Int>()
    .switchIfEmpty { it.onError(Exception()) } // or HttpStatusException(404) in your case
    .subscribe({
        println(it)
    }, {
        it.printStackTrace()
    })

Flowable пусто, и то, что вы получаете вниз по течению, это Exception, созданный внутри switchIfEmpty.Обратите внимание, что вы должны позвонить it.onError внутри switchIfEmpty.

...