[英]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.