java - Spring WebClient,并行调用同一服务,收集成功和错误以进行响应
问题描述
编辑:核心问题是处理来自 Mono 的错误并转换为新的对象类型,以便以后可以根据需要进行映射。现在任何未处理的错误都会停止流。如果我使用 onErrorReturn,那么我必须返回原始响应类型 (UpdateResponse),但我想返回带有错误详细信息的新类型。我可以使用 onErrorResume 并返回 Mono.empty() 但我想再次捕获错误详细信息。
我希望利用 Spring 的 Reactive WebClient 对外部服务进行并行调用,该服务将更新给定 ID 列表的用户,然后将任何错误/成功收集到单个响应中,然后我可以返回给调用者。到目前为止,我看到的所有错误处理都不允许我将数据映射到新的响应,因此不确定如何处理。
// This is the class where I want to collect and map successes/errors to a new response object
public class UpdateUserService {
private final UpdateUserClient updateUserClient;
public Mono<UpdateUserResponse> updateUser(List<Long> userIds, UpdateUserRequest request) {
// Parallel calls to updateUserClient
Mono<UpdateUserResponse> resp = Flux.fromIterable(userIds)
.flatMap(userId -> updateUserClient.updatUser(userId, request))
// How to maps successes and handle errors here to UpdateUserResponse?
...
return resp;
}
}
// Supporting classes
public class UpdateUserResponse {
List<UpdateUserResult> results;
}
public class UpdateUserResult {
Long id;
Boolean success;
String message;
}
public class UpdateUserClient {
private final WebClient webClient;
private final String path;
public Mono<UpdateResponse> updatUser(Long userId, UpdateUserRequest request) {
return webClient.put()
.uri(uriBuilder -> uriBuilder
.path(path)
.queryParam("userId", userID)
.build())
.body(request, UpdateUserRequest.class)
.accept(MediaType.APPLICATION_JSON)
.retrieve()
.bodyToMono(UpdateResponse.class); // UpdateResponse just contains a success boolean
}
}
解决方案
推荐阅读
- css - 我应该添加隐形
- angular - 如何在 Angular 中创建服务器的 loginFilter?
- firebase - 无法与函数通信。函数调用被中断。在 Firebase 中
- dart - 如何在飞镖编程语言中使用 ceil?
- c++ - 我如何阅读以下声明?
- python - Bitbucket 应用程序密码拒绝使用“pip”进行安装,但适用于“pipenv”
- cuda - 无法在 cuda 中将数据从设备传输到主机
- laravel - 我写了“composer require larabook/gateway”来安装软件包,但我收到了这个错误
- c# - 我如何使用 Visual Studio 内置数据库而不是这些硬编码数据来进行级联下拉菜单?
- python - 如何在 solaris 上从源代码构建 64 位 python