日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網為廣大站長提供免費收錄網站服務,提交前請做好本站友鏈:【 網站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

本文介紹了Spring Reactive WebFlux–如何定制BadRequest錯誤消息的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學習吧!

問題描述

在我的請求處理程序中,如果傳入的accountId不能轉換為有效的ObjectId,我希望捕獲錯誤并發回有意義的消息;然而,這樣做會導致返回類型不兼容,并且我不知道如何實現這個相當簡單的用例。

我的代碼:

  @GetMapping("/{accountId}")
  public Mono<ResponseEntity<Account>> get(@PathVariable String accountId) {
      log.debug(GETTING_DATA_FOR_ACCOUNT, accountId);

      try {
        ObjectId id = new ObjectId(accountId);
        return repository.findById(id)
            .map(ResponseEntity::ok)
            .switchIfEmpty(Mono.just(ResponseEntity.notFound().build()));
      } catch (IllegalArgumentException ex) {
        log.error(MALFORMED_OBJECT_ID, accountId);
        // TODO(marco): find a way to return the custom error message. This seems to be currently
        //  impossible with the Reactive API, as using body(message) changes the return type to
        //  be incompatible (and Mono<ResponseEntity<?>> does not seem to cut it).
        return Mono.just(ResponseEntity.badRequest().build());
      }
  }

body(T body)方法更改返回的Mono的類型,使其為String)Mono<ResponseEntity<String>>;但是,將該方法的返回類型更改為Mono<ResponseEntity<?>>也不起作用:

        ...
        return Mono.just(ResponseEntity.badRequest().body(
            MALFORMED_OBJECT_ID.replace("{}", accountId)));

因為它在另一個return語句中給出了不兼容的類型錯誤:

error: incompatible types: Mono<ResponseEntity<Account>> cannot be converted to Mono<ResponseEntity<?>>
            .switchIfEmpty(Mono.just(ResponseEntity.notFound().build()));

顯然,將方法的返回類型更改為Mono<?>是可行的,但隨后的響應是ResponseEntity的序列化JSON,這不是我想要的。

我也嘗試過使用onErrorXxxx()方法,但它們在這里也不起作用,因為轉換錯誤甚至在計算通量之前就發生了,而且我只得到了一個帶有空消息的&quot;vanilla&quot;400錯誤。

我唯一能想到的解決方法就是向Account對象添加一個message字段并返回該字段,但這確實是一個可怕的黑客攻擊。

推薦答案

@Thomas-andolf的回答幫助我找到了實際的解決方案。

對于將來遇到這個問題的任何人來說,我實際上是如何解決這個難題的(當然,您仍然需要try/catch來攔截ObjectId構造函數拋出的錯誤):

  @GetMapping("/{accountId}")
  public Mono<ResponseEntity<Account>> get(@PathVariable String accountId) {
    return Mono.just(accountId)
        .map(acctId -> {
          try {
            return new ObjectId(accountId);
          } catch (IllegalArgumentException ex) {
            throw new ResponseStatusException(HttpStatus.BAD_REQUEST,
                MALFORMED_OBJECT_ID));
          }
        })
        .flatMap(repository::findById)
        .map(ResponseEntity::ok)
        .switchIfEmpty(Mono.just(ResponseEntity.notFound().build()));
  }

要真正看到返回的Body中的message,需要在application.properties中添加server.error.include-message=always(參見here)。

使用onError()在這里不起作用(我確實在它的所有變體中嘗試過),因為它需要Mono<ResponseEntity<Account>>,并且無法從錯誤狀態生成一個(在添加消息正文時)。

這篇關于Spring Reactive WebFlux–如何定制BadRequest錯誤消息的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,

分享到:
標簽:BadRequest Reactive Spring WebFlux 定制 消息 錯誤
用戶無頭像

網友整理

注冊時間:

網站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網站吧!
最新入駐小程序

數獨大挑戰2018-06-03

數獨一種數學游戲,玩家需要根據9

答題星2018-06-03

您可以通過答題星輕松地創建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數有氧達人2018-06-03

記錄運動步數,積累氧氣值。還可偷

每日養生app2018-06-03

每日養生,天天健康

體育訓練成績評定2018-06-03

通用課目體育訓練成績評定