我有 3 个微服务应用程序。我正在尝试使用反应包中的 webclient 进行 2 次异步调用,然后在收到响应时将它们组合起来。
示例代码:(引用自 - https://docs.spring.io/spring/docs/5.1.9.RELEASE/spring-framework-reference/web-reactive.html#webflux-client-synchronous)
Mono<Person> personMono = client.get().uri("/person/{id}", personId)
.retrieve().bodyToMono(Person.class);
Mono<List<Hobby>> hobbiesMono = client.get().uri("/person/{id}/hobbies", personId)
.retrieve().bodyToFlux(Hobby.class).collectList();
Map<String, Object> data = Mono.zip(personMono, hobbiesMono, (person, hobbies) -> {
Map<String, String> map = new LinkedHashMap<>();
map.put("person", personName);
map.put("hobbies", hobbies);
return map;
})
.block();
我的问题是如何向 get 调用添加异常处理?
如何检查我是否收到 404 或 204 或其他信息?
我努力了:
将 .onStatus() 添加到 GET 调用
.onStatus(HttpStatus::is4xxClientError, clientResponse ->
Mono.error(new Data4xxException(String.format(
"Could not GET data with id: %s from another app, due to error:
%s", key, clientResponse))))
.onStatus(HttpStatus::is5xxServerError, clientResponse ->
Mono.error(new Data5xxException(
String.format("For Data %s, Error Occurred: %s", key, clientResponse))))
添加异常处理程序 - 但我确实没有控制器,所以这似乎不起作用。
@ExceptionHandler(WebClientException.class)
public Exception handlerWebClientException(WebClientException webClientException) {
return new Data4xxException("Testing", webClientException);
}
添加了一个包含 ControllerAdvice 和 ExceptionHandler 的类
@ControllerAdvice
public class WebFluxExceptionHandler {
@ExceptionHandler(WebClientException.class)
public Exception handlerWebClientException(WebClientException webClientException) {
return new Data4xxException("Testing", webClientException);
}
}
但我没有看到它们打印在 spring-boot 日志中。
Mono.zip.block() 方法只是返回 null 并且实际上不会抛出任何异常。
如何让 zip 方法抛出异常而不返回 null ?
一只萌萌小番薯
HUWWW
HUH函数
相关分类