Java SpringWebFlux:在同一个对象上执行多个映射?

Java SpringWebFlux:在同一个对象上执行多个映射?,java,spring,rest,spring-webflux,Java,Spring,Rest,Spring Webflux,我目前正在用SpringWebFlux做我的第一个被动项目。不幸的是,我已经被分配了一项任务,而我似乎无法找到解决方案。 我想接收Mono并对其执行操作,这取决于其他Mono完成的操作。我的想法是这样的: private Mono<ResourceModel> setResourcesIfExisting(String resourceName) { return resourceService.findByFilter(resourceName)

我目前正在用SpringWebFlux做我的第一个被动项目。不幸的是,我已经被分配了一项任务,而我似乎无法找到解决方案。 我想接收Mono并对其执行操作,这取决于其他Mono完成的操作。我的想法是这样的:

private Mono<ResourceModel> setResourcesIfExisting(String resourceName) {
        
        return resourceService.findByFilter(resourceName)
                .flatMap(res -> service1.findByFilter(resourceName).map(res::setResource))
                .flatMap(res -> service2.findByFilter(resourceName).map(res::setResource))
                .flatMap(res -> service3.findByFilter(resourceName).map(res::setResource))
                ;
    }
private Mono setResourcesIfExisting(字符串resourceName){
返回resourceService.findByFilter(resourceName)
.flatMap(res->service1.findByFilter(resourceName).map(res::setResource))
.flatMap(res->service2.findByFilter(resourceName).map(res::setResource))
.flatMap(res->service3.findByFilter(resourceName).map(res::setResource))
;
}
resourceService将找到Mono,请注意,这已经是我想要返回的同一类型。但是现在,我有一些其他的服务来提供资源,理论上,所有这些服务中应该只有一个满足需求的资源mono。 从我的测试中,如果我使用其中一个平面图,它总是有效的,但只要我有两个或更多连续的平面图,在更高级别的方法中收集的列表结果就会为空(我对通量的每个元素使用上述方法)


有人能告诉我为什么会这样吗?如上所述,我几乎不了解我在做什么,但尝试了很多,到目前为止都没有成功。

我真的不明白你的问题
,在理论上,所有这些服务都应该只有一个满足的资源
你所说的
满足
是什么意思<代码>但是一旦我有两个或更多的
我猜你是指两个或更多的平面图
flatMap
将获取一个项目,然后将该项目作为
Mono
返回到链中的下一个
flatMap
。我认为如果您扩展您的示例并提供解释所有这些
service1.findByFilter
的功能以及
res.setResource
的功能的代码会更好。你的意图是什么。当我们没有一个完全运行的示例时,很难给你任何指针。@Toerktumlare我指的是一个
Mono
,它实际包含一个值,因为
Mono
最多只能包含一个对象。抱歉,如果这是一个不正确的术语。基本上,我希望
service1
service2
service3
中正好有一个返回一个值。是的,“两个或多个”表示两个或多个
flatMap
s。“findByFilter”方法各自返回从数据库获取的模型,“setResource”方法是基本的设置器。它们用于将接收到的模型设置到相应变量中,并将其设置到来自
resourceService
ResourceModel
中。好的
map
flatMap
需要返回值。反应式编程从函数式编程中获取了很多基础知识,这意味着要避免可变性。这意味着使用setter操作创建的对象不是您应该做的事情,因为它会给您带来很多问题。因此,由于我不了解您的代码的全貌,因此很难实际向您提供任何建议,但是如果您想对其进行变异,则需要将
res
类传递给Flatmap。这也意味着在获取新数据后,需要传递
res
对象