Java Mono::然后返回null

Java Mono::然后返回null,java,reactive-programming,spring-webflux,project-reactor,Java,Reactive Programming,Spring Webflux,Project Reactor,我对反应式编程比较陌生。 我的问题是关于Mono::then 我要做的是,从传入的请求中提取主体,将其设置为静态变量。 完成后,发送一个响应,说明服务已启动。 但是下面的代码总是返回“servicestarted for:null” 我认为Mono::then应该在第一个Mono完成后运行(在本例中,是在设置静态变量之后),并返回“serviceststartedfora,b,c” 我的理解错了吗 (此外,欢迎对任何代码进行批评) public状态(服务器请求请求){ monobody=req.

我对反应式编程比较陌生。 我的问题是关于
Mono::then

我要做的是,从传入的请求中提取主体,将其设置为静态变量。 完成后,发送一个响应,说明服务已启动。 但是下面的代码总是返回“servicestarted for:null”

我认为
Mono::then
应该在第一个Mono完成后运行(在本例中,是在设置静态变量之后),并返回“serviceststartedfora,b,c”

我的理解错了吗

(此外,欢迎对任何代码进行批评)

public状态(服务器请求请求){
monobody=req.bodyToFlux(Request.class).collectList();
返回ServerResponse.ok()
.body(body.doOnNext)(i->{
服务a=i;
info(“为:{}启动的服务”,i.toString());
})
.then(Mono.just(“服务开始于:+Service.a)),String.class);
}

非常不鼓励通过静态变量进行通信(尤其是在函数式和反应式编程中)。因为在您的问题中,您没有提供足够的关于您启动的
服务的信息,所以推荐有点困难

然而,根据现有信息,我将从以下内容开始:

public状态(服务器请求请求){
返回请求bodyToFlux(请求类)
.LIST()
.doOnNext(requestBody->System.out.println(“您的服务是在后台启动的吗?”)
.flatMap(requestBody->ServerResponse.ok().syncBody(“服务已为:“+requestBody”)启动);
}

“Mono::then should run after”无需运行。Mono::just javadoc:“创建一个发出指定项的新Mono,该项在实例化时捕获。”您可以检查您对Mono::的假设,然后使用Mono::fromCallable,Mono::fromSupplier代替Mono::JustBody。doOnNext?感谢Martin的回复。后来我做了一些更改,不再使用静态变量。我想知道为什么
Mono::然后
没有按预期工作。我的理解是,它应该等到前一个Mono结束,然后在then()中发出Mono。这是因为在流的第一部分执行之前,内部的字符串正在被急切地评估,细节:正如另一位评论员所建议的,您可以使用Mono::fromSupplier来解决这个问题。这是因为在流的第一部分执行之前,内部的字符串正在被急切地评估。谢谢你的解释。可以认为这是封闭的。
public Mono<ServerResponse> getStatus(ServerRequest req) {
        Mono<List<Request>> body = req.bodyToFlux(Request.class).collectList();
        return ServerResponse.ok()
                .body(body.doOnNext(i -> {
                    Service.a = i;
                    logger.info("Service started for : {}", i.toString());
                })


                        .then(Mono.just("Service started for: " + Service.a)), String.class);
    }