我现在正在使用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
}
答案 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();
}