如何捕获阻止的Webclient GET请求的onStatus方法中引发的异常?

时间:2019-08-09 12:28:53

标签: java spring spring-webflux

我现在正在使用WebClient而不是rest模板来调用API。我们的目标是在不久的将来实现冲刺,我们将使我们的所有客户端都具有响应性和非阻塞性,但是在短期内,我们可以使用阻塞性调用,但至少要有WebClient。我们要做的一件事是在返回204 No Content状态时引发自定义异常,以便使用客户端的代码必须捕获该异常

我曾尝试从.onStatus(...)抛出异常,但是发生的是它没有从下面的代码中抛出PersonNotFoundException,而是与{{1 }}嵌套

客户代码

reactor.core.Exceptions$ReactiveException

呼叫代码

PersonNotFoundException

我希望得到的结果是public PersonDto getPersonDetails(String lastName) throws PersonNotFoundException{ return webClient.get() .uri(personEndpoint + "/{lastName}", lastName) .retrieve() .onStatus(status -> status.equals(HttpStatus.NO_CONTENT), clientResponse -> Mono.error(new PersonNotFoundException("Person " + lastName + "Not Found"))) .bodyToMono(PersonDto.class) .block(); } 将被调用代码的catch语句捕获。结果是抛出了ReactiveException,而未捕获的异常终止了我的程序:

 PersonDto personDto = null;
 try {
    personDto = personServiceCLient.getPersonDetails("Smith");
 } catch (PersonNotFoundException e) {
    //do custom logic for 204 errors
 }

1 个答案:

答案 0 :(得分:0)

尝试使用Exception util类。现在可能为时已晚,但是很好。

public PersonDto getPersonDetails(String lastName) throws PersonNotFoundException{
return webClient.get()
          .uri(personEndpoint + "/{lastName}", lastName)
          .retrieve()
          .onStatus(status -> status.equals(HttpStatus.NO_CONTENT),
                        clientResponse -> throw Exceptions.propagate(new PersonNotFoundException("Person " + lastName + "Not Found")))
          .bodyToMono(PersonDto.class)
          .block();

}