Micronaut地图为空Flowable至404

时间:2019-06-04 18:00:42

标签: java kotlin rx-java micronaut

给出:我有一个生成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!

2 个答案:

答案 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