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

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

點(diǎn)擊這里在線咨詢客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會(huì)員:747

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

問題描述

在我的請(qǐng)求處理程序中,如果傳入的accountId不能轉(zhuǎn)換為有效的ObjectId,我希望捕獲錯(cuò)誤并發(fā)回有意義的消息;然而,這樣做會(huì)導(dǎo)致返回類型不兼容,并且我不知道如何實(shí)現(xiàn)這個(gè)相當(dāng)簡(jiǎn)單的用例。

我的代碼:

  @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)));

因?yàn)樗诹硪粋€(gè)return語句中給出了不兼容的類型錯(cuò)誤:

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

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

我也嘗試過使用onErrorXxxx()方法,但它們?cè)谶@里也不起作用,因?yàn)檗D(zhuǎn)換錯(cuò)誤甚至在計(jì)算通量之前就發(fā)生了,而且我只得到了一個(gè)帶有空消息的&quot;vanilla&quot;400錯(cuò)誤。

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

推薦答案

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

對(duì)于將來遇到這個(gè)問題的任何人來說,我實(shí)際上是如何解決這個(gè)難題的(當(dāng)然,您仍然需要try/catch來攔截ObjectId構(gòu)造函數(shù)拋出的錯(cuò)誤):

  @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()在這里不起作用(我確實(shí)在它的所有變體中嘗試過),因?yàn)樗枰?code>Mono<ResponseEntity<Account>>,并且無法從錯(cuò)誤狀態(tài)生成一個(gè)(在添加消息正文時(shí))。

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

分享到:
標(biāo)簽:BadRequest Reactive Spring WebFlux 定制 消息 錯(cuò)誤
用戶無頭像

網(wǎng)友整理

注冊(cè)時(shí)間:

網(wǎng)站:5 個(gè)   小程序:0 個(gè)  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會(huì)員

趕快注冊(cè)賬號(hào),推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨(dú)大挑戰(zhàn)2018-06-03

數(shù)獨(dú)一種數(shù)學(xué)游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學(xué)四六

運(yùn)動(dòng)步數(shù)有氧達(dá)人2018-06-03

記錄運(yùn)動(dòng)步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓(xùn)練成績(jī)?cè)u(píng)定2018-06-03

通用課目體育訓(xùn)練成績(jī)?cè)u(píng)定