给出:我有一个生成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!
答案 0 :(得分:0)
一种可能的解决方案是使用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)
}
}
}
}
这不是最佳解决方案,而是可行的解决方案。
答案 1 :(得分:-2)
我不了解Micronaut,但我想这可能是您想要的:
Flowable.empty<Int>()
.switchIfEmpty { it.onError(Exception()) } // or HttpStatusException(404) in your case
.subscribe({
println(it)
}, {
it.printStackTrace()
})
Flowable
为空,而您得到的下游是在Exception
内部创建的switchIfEmpty
。请注意,您必须在it.onError
内部调用switchIfEmpty
。