[英]Micronaut map empty Flowable to 404
鑒於:我有一個產生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()
}
}
我想要實現的是:當flowable為空時->拋出HttpStatusException(404)
。
否則,返回其中包含數據的flowable。
我已經嘗試過的
我嘗試了以下RxJava運算符的不同組合:
我經歷了什么
沒有一個選項在瀏覽器/郵遞員中產生404。
幾個選項只是“無所事事”。 這意味着該頁面未在瀏覽器中加載。
其他選項正在創建帶有空主體的“確定”(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!
一個可能的解決方案是使用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)
}
}
}
}
這不是最佳解決方案,而是可行的解決方案。
我不了解Micronaut,但我想這可能是您想要的:
Flowable.empty<Int>()
.switchIfEmpty { it.onError(Exception()) } // or HttpStatusException(404) in your case
.subscribe({
println(it)
}, {
it.printStackTrace()
})
Flowable
為空,而下游則是在switchIfEmpty
內部創建的Exception
。 請注意,您必須在it.onError
內部調用switchIfEmpty
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.