我需要进行3个相关的WebClient API调用。最后,我想要一个最终响应对象的Mono。我需要使用第一个API响应中的值来调用第二个API(它将返回Purchase类的Mono)。Purchase类将包含2个成员变量
目前,我一直在研究如何为列表中的每个值(由第二个API返回)异步调用第三个API
service.get购买返回Mono
class Purchase{
private List<Item> purchasedItemsList;
}
class Item {
private int itemId;
private int categoryId;
private String itemName;
}
public Mono<FinalResponse> getEndResults(UserRequest userRequest) {
Mono<User> response1 = service.getUserResponse(userRequest);
return response1.flatMap(response -> {
int userId = response.getUserId();
FinalResponse finalResponse = new FinalResponse();
List<AllItems> itemList = new LinkedList<>();
return service.getPurchase(userRequest, userId)
.map(purchasedItem -> {
val.getPurchasedItemsList().forEach(oneItem -> { // please help me how to go about from here
service.getSimilarItemsInCategory(userRequest, userId, oneItem.getCategoryId)
.map(similarItem -> {
AllItems allItem = new AllItems();
allItem.setPurchasedItem(oneItem);
allItem.setSimilarItem(similarItem);
itemList.add(allItem);
});
});
finalResponse.setResults(itemList);
return finalResponse;
});
});
}
class FinalResponse {
private User user;
private List<AllItems> results;
}
class AllItems {
private Item purchasedItem;
private List<Item> similarItem;
}
基本上,我需要的最终响应是
{
"users":{//UserObject//},
"results": [
{
"purchasedItem": {// Purschased Item 1},
"similarItems": [
{//Similar Item 1},
{//Similar Item 2}
]
},
{
"purchasedItem": {// Purschased Item 1},
"similarItems": [
{//Similar Item 1},
{//Similar Item 2}
]
}
]
}
下面是Toerktumlare的评论:如果WebClient调用返回Monos或简单值或列表的流量,这可能相当简单。
您可以使用flatMapMany()
或flatMapIterable()
。
这个简化的例子怎么样?
public Mono<FinalResponse> getEndResults(UserRequest userRequest) {
Mono<User> userResponse = service.getUserResponse(userRequest);
return userResponse.flatMap(response -> {
int userId = response.getUserId();
return service.getPurchase(userRequest, userId)
.map(Purchase::getPurchasedItemsList)
.flatMapIterable(purchasedItems -> purchasedItems)
.flatMap(oneItem -> getSimilarItemInCategory(userRequest, userId, oneItem))
.collectList();
})
.map(itemList -> {
FinalResponse finalResponse = new FinalResponse();
finalResponse.setResults(itemList);
return finalResponse;
});
}
public Mono<AllItems> getSimilarItemInCategory(UserRequest userRequest, int userId, Item oneItem) {
return service.getSimilarItemsInCategory(userRequest, userId, oneItem.getCategoryId())
.map(similarItem -> {
AllItems allItem = new AllItems();
allItem.setPurchasedItem(oneItem);
allItem.setSimilarItem(similarItem);
return allItem;
});
}
RestTemplate文档中的Spring注意: 注意:从5.0开始,这个类处于维护模式,只接受微小的更改请求和bug。请考虑使用org.springframework.web.reactive.client.WebClient,它具有更现代的API,支持同步、异步和流场景。 https://docs.spring.io/spring-framework/docs/current/javadoc
我搜索了许多网站和文档,但异步调用使用的代码相同。但不确定为什么它不起作用。如果我错过了什么,有人能帮我吗?
我在尝试使用“create”创建WebClient实例的线路上收到一个NoClassDefFoundError。尝试了builder(),但仍然是一样的。 请告诉我添加的依赖项有什么问题,以及如何解决这个问题。 我添加的依赖项是 StackTrace:
第一次尝试这样做,所以不确定我在做什么或如何设置它。 我需要调试我在应用程序中使用的库。最初,我把它安装在中。这对于调试来说不太好,我遇到了这个答案,描述了如果你需要对它进行修改,如何处理依赖项: https://stackoverflow.com/a/13302095/3123109 所以现在我正在做,它将回购的副本放入我的。 我的印象是这样做后它会“起作用”。当然没那么简单... 我试过的 >
我希望从spring reactive WebClient进行SOAP调用。我找不到任何文件。想知道会有什么方法。现在我在想 null 缺点和其他方法是什么?
我希望以并行方式并使用无阻塞线程(如Python中的eventlet) 我想用这样的线程创建单独的共享工作线程池,以便不为每个传入请求创建一个共享工作线程池。 以下是有关调度器的文档http://projectreactor.io/docs/core/release/reference/#schedulers 但是我不能为每个请求创建新的工作池,池中的线程仍然以阻塞的方式工作。 如果有人用Spri