当前位置: 首页 > 知识库问答 >
问题:

使用WebFlux处理调用Restful服务的错误示例

彭正谊
2023-03-14
Mono<ResponseObject> mono = webClient.post()
   .uri(url.toString())
   .header("Authorization", authToken)
   .body(Mono.just(contract), contract.getClass())
   .retrieve()
   .bodyToMono(ResponseObject.class);
"success" : true,
"httpStatus": 200,
"messages" : [
   "Informational message or, if not 200, then error messages"
],
result: {
   "data": {}
}

这似乎是我想做的:Spring Webflux:Webclient:让body出现错误,但仍然不能让它工作。不确定exchange()是什么

共有1个答案

危彬彬
2023-03-14

正确的处理方法是通过.onerrorResume,当出现任何错误时,它允许您使用函数订阅回退发布服务器。您可以查看生成的异常并返回自定义回退响应。

您可以这样做:

Mono<ResponseObject> mono = webClient.post()
   .uri(url.toString())
   .header("Authorization", authToken)
   .bodyValue(contract)
   .exchangeToMono(response -> {
      if (response.statusCode().equals(HttpStatus.OK)) {
          return response.bodyToMono(ResponseObject.class);
      }
      else if (response.statusCode().is4xxClientError()) {
          return response.bodyToMono(ResponseObject.class);
      }
      else {
          Mono<WebClientResponseException> wcre = response.createException();
          // examine wcre and create custom ResponseObject

          ResponseObject customRO = new ResponseObject();
          customRO.setSuccess(false);
          customRO.setHttpStatus(response.rawStatusCode());
          // you can set more default properties in response here
          return Mono.just( customRO );
      }
   });

此外,您不应该在Java代码中的任何地方使用.block()。只需确保从REST控制器返回一个单字 即可。如果希望在返回客户端之前检查响应,可以在管道末尾的.map()处理程序中这样做(就在.onerrorResume处理程序之后)

   .map(response -> {
      // examine content of response

      // in the end just return it
      return response;
   });
 类似资料:
  • 我试图通过使用Java+Spring+WebFlux开始反应性编程。 当我在endpoint上调用时,我得到一个 下面是上的服务层 我还尝试删除和中的concinting,但没有成功。

  • 我正在编写一个java适配器,用于向WebService发布一些内容。在http服务中,我使用一个ExceptionHandler: 如果我用卷曲/邮递员来称呼的话,那很管用。 在成功的情况下,我希望从location头返回字符串。但是,例如,如果http-status为400,我如何抛出异常,并将正文中的错误消息添加到异常中呢? 谢谢

  • 当我在netbeans 8.0.2中清理和构建项目时,会出现以下错误。如何解决这个问题

  • 我正在尝试调用一个简单的RESTFul API,它使用WSO2 ESB发布用户名和密码,但在尝试使用Postman调用它时没有得到响应: RESTFul API URL为: 要从ESB调用的URL是 我在WSO2 ESB中进行的API配置是 我发布了一个简单的JSON元素: WSO2控制台显示以下消息: Info-LogMediator到:http://www.w3.org/2005/08/add

  • 我想在以下条件下抛出自定义异常: > 如果我得到了json格式的正确错误响应,我想反序列化它,并在onStatus()中抛出名为CommonException的异常 如果作为响应的一部分接收HTML内容或反序列化未成功执行,则我希望抛出GenericeException,这是我在onErrorMap()中创建的 在抛出GenericException时,我希望将从下游响应获得的相同HttpStat

  • SI5+支持,这意味着我们现在可以构建一个反应消息传递系统。然而,这也意味着设计已经考虑周全,通常的错误处理方法不起作用。在反应流中,消息是(),它不会引发异常,但会发出错误通知。因此,消息上设置的错误通道标头是无用的,因为SI不知道导致了错误。考虑以下代码: 上面的代码片段中缺少的是将异常发送到消息上配置的错误通道。我们怎么能这么做?