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

Spring boot webFlux内部单声道不发射数据

谢财
2023-03-14

我是Spring新来的。我在这里遇到了一个小问题“userMono不是空的”,但这部分代码正在执行“switchiffempty(Mono.just(“hello123”)”

    Mono<String> someMono = serverRequest.bodyToMono(String.class);


    Mono<List<String>> listMsgMono = someMono.flatMap(json -> {
        JSONObject jsonObject = Util.getJsonObjectFromString(jsonString);
        String id = Util.getStringFromJSON(jsonObject, "id");
        JSONArray jsonArray = Util.getJSONArrayFromJSON(jsonObject, "array");
        int length = jsonArray.length();

        for (int index = 0; index < length; index++) {
            String email = Util.getStringFromJSONArray(jsonArray, index);
            LOGGER.debug("email :" + email);
            Mono<User> userMono = repository.findByEmail(email);
            //inner mono is not emmitting data 
            userMono.flatMap(user -> {
                otherRepository.findById(id).flatMap(l -> {
                    return Mono.just("all welcome");
                }).switchIfEmpty(someRepository
                        .findById(id).flatMap(r ->{
                            return Mono.just("all done");
                        }).switchIfEmpty((Mono.just("hello0000"));
                return Mono.just("successfull");
            })
            .switchIfEmpty(Mono.just("hello123"));

        }
        return Mono.just("hello");
    });

共有1个答案

魏臻
2023-03-14

问题是在实现中没有链接操作符。每个操作符调用都返回一个新的发布者实例,您需要将其重新分配给一个变量,否则在管道中不会考虑此操作符。

查看项目Reactor文档中的此提示。

 类似资料:
  • 我有两项要求: 有了这些,我想做以下工作: 当我调用它时,我得到以下输出: 当然,由于异步单声道映射,流在结果实际出现之前就关闭了。我怎样才能保持这个非阻塞,但也确保结果在调用上完成之前到达?

  • 给定以下monos: 双: 和: 具有相同的输出: 和之间有什么区别,在这种情况下? 从https://projectreactor.io/docs/core/release/reference/index.html#which-operator: [如果你]有一个序列,但[你]对值不感兴趣,并且[你]想在最后切换到另一个单声道,[使用]。 [如果您]希望通过将发布者从1个Mono和任何源端协调到

  • 我面临的情况是,我必须使用2 Mono,其中第二个将依赖于第一个的Id字段,并在第一个Mono的主体中返回第二个的响应。 例如: 然后将结果返回为 我试过了 但像这样,我只能返回第二个单声道的响应。 通过尝试Map或Flatmap,它只在第二个单声道上起作用。 请提出建议。

  • 问题内容: 为了帮助理解monad是什么,有人可以使用Java提供示例吗?有可能吗? 如果您从此处http://jdk8.java.net/lambda/下载预发行版本的兼容Lambda的JDK8,则可以使用Java使用Lambda表达式。 下面显示了使用此JDK的lambda示例,有人可以提供相对简单的monad吗? 问题答案: 仅供参考: 提出的JDK8可选类 确实满足 了Monad的三个定律

  • 我最近一直在学习使用Java中的reactor库和Spring框架进行反应式编程,并且在很大程度上我已经能够掌握它。然而,我发现自己有好几次遇到同样的情况,我想知道我哪里出了问题。 我正在努力解决的问题的要点是,我经常想用mono做一些事情,比如找到一些补充数据,然后将其添加回原始mono中。zip函数在我看来是一个理想的候选函数,但最终我订阅了两次原始mono,这不是我的意图。 这里有一个人为的

  • 我不知道或问这个问题,除了这里,如果不是我道歉的地方。 这里有一个REST请求,它附带了一个简单的bean,其中包含一个列表等属性。对此列表进行迭代,以使用返回Mono(findOne)的响应mongo调用。但我不认为我找到了正确的方法: 在我看来,“反应性”的想法并不是必须做一个块,但我没有找到如何做,否则。 有人能帮我找到做这项任务的最佳方法吗?