繁体   English   中英

Micronaut地图为空Flowable至404

[英]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运算符的不同组合:

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

我经历了什么

没有一个选项在浏览器/邮递员中产生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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM