当前位置: 首页 > 知识库问答 >
问题:

Spring 2.0 WebFlux:将多个mono合并为单个flux,其中string是转换为string的json

孟乐逸
2023-03-14

我有三个json字符串,如下所示

Mono<String> strInventoryResp=invWebClient.get().
            uri("/findATSInventory?skuId="+skuId).
            exchange().flatMap(resp-> resp.bodyToMono(String.class));


    Mono<String> strProductResponse=productClient.get().
            uri("/v2/products/id/"+skuId).
            exchange().flatMap(resp-> resp.bodyToMono(String.class));


    Mono<String> strItemResp=productClient.get().
            uri("/v2/items?id="+skuId).
            exchange().flatMap(resp-> resp.bodyToMono(String.class));
Flux.merge(strProductResponse,strItemResp,strInventoryResp);

共有1个答案

丰超
2023-03-14

另一个类似Piotr的解决方案,但使用reduce、lombok和immutable Aggregator。

@Test
public void test() {
    Mono<String> strInventoryResp = Mono.just("strInventoryResp");
    Mono<String> strProductResponse = Mono.just("strProductResponse");
    Mono<String> strItemResp = Mono.just("strItemResp");

    Mono<Aggregator> result = Flux.merge(
            strInventoryResp.map(s -> Aggregator.builder().strInventoryResp(s).build()),
            strItemResp.map(s -> Aggregator.builder().strItemResp(s).build()),
            strProductResponse.map(s -> Aggregator.builder().strProductResponse(s).build()))
            .reduce((aggregator, aggregator2) -> aggregator.toBuilder()
                    .strInventoryResp(Optional.ofNullable(aggregator2.strInventoryResp)
                            .orElseGet(() -> aggregator.strInventoryResp))
                    .strProductResponse(Optional.ofNullable(aggregator2.strProductResponse)
                            .orElseGet(() -> aggregator.strProductResponse))
                    .strItemResp(Optional.ofNullable(aggregator2.strItemResp)
                            .orElseGet(() -> aggregator.strItemResp))
                    .build());

    //now you have Mono with filled Aggregator and you can make your json result
}

@Builder(toBuilder = true)
private static class Aggregator {
    private final String strInventoryResp;
    private final String strProductResponse;
    private final String strItemResp;
}

我有一个关于你的例子的通知。看起来您有多个web客户端。这是一种不好的做法。由于线程的使用(多个web客户端将创建多个线程),因此应用程序应该选择一个web客户端

 类似资料:
  • 问题内容: 我正在开发一些应用程序,它允许从SD卡中选择图像,将其保存到数据库中并为ImageView设置此值。我需要知道将uri转换为字符串并将字符串转换为uri的方法。现在,我使用了Uri的getEncodedPath()方法,但是例如,此代码不起作用: 因此,我不知道如何将Uri保存到数据库中并根据保存的值创建新的Uri。请帮我修复它。 问题答案: 我需要知道将uri转换为字符串并将字符串转

  • 问题内容: 如何从float转换为string或从string转换为float? 在我的情况下,我需要在2个值字符串(我从表中获得的值)和我计算出的浮点值之间进行断言。 我尝试从浮动到字符串: 但是断言失败 问题答案: 使用Java的类。 为了进行比较,将字符串转换为float并比较两个float总是更好。这是因为对于一个浮点数,存在多个字符串表示形式,与字符串相比,它们是不同的(例如“ 25”!

  • 问题内容: 我喜欢从getter方法中“猜测”属性名称。因此,“ getSomeAttribute”应转换为“ someAttribute”。 通常我会做类似的事情 很丑吧?我通常将其隐藏在一种方法中,但是有人知道更好的解决方案吗? 问题答案: 我认为您的解决方案很好。我认为没有比这更简单的方法了。

  • 更新: 一点我想要实现的内容。我有两个服务--一个通过Http返回me,另一个通过Redis返回。对于这两种情况,我有完全相同的功能-10-15个操作符链,我想要实现的是避免重复代码。 例如:

  • 我希望代码得到一个int作为参数,如果年龄是奇数,则加3,如果是偶数,则加2,然后作为字符串返回。 有了这个代码我得到了 不兼容的类型:无法将int转换为字符串 九号线不是已经换了吗?

  • 问题内容: 我只想编写这样的代码: 我以为可以代表任何类型,所以也可以代表任何类型,现在我知道我错了,是一个整体类型,不能视为。 因此,有人可以帮助我如何使此代码正常工作,或其他解决方案吗? PS :我知道或可以相互转换,但是实际上这并不是我的意图,可能还有另一种类型,而不是and 。 问题答案: 现在我知道我错了,是一个整体类型,不能视为。 是的,那是因为它是它自己的类型(而不是其他任何类型的“