簡體   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