如何在Spring反应堆中的Mono或FLux的flatMap或flatMapMany主体中包含多个语句?
我有以下代码:如何在Spring反应堆中的Mono或FLux的flatMap或flatMapMany主体中包含多个语句?,spring,project-reactor,Spring,Project Reactor,我有以下代码: Mono<Property> property = propertyService.findById(id); String title; Flux<Photo> photos = property.flatMapMany(prop -> { title = prop.title + '-' + prop.type; return ph
Mono<Property> property = propertyService.findById(id);
String title;
Flux<Photo> photos = property.flatMapMany(prop ->
{
title = prop.title + '-' + prop.type;
return photoService.findByPropertyId(prop.getId());
}
);
model.addAttribute("prop", property);
model.addAttribute("title", title);
model.addAttribute("photos", photos);
// ajx is query param coming from request
if(ajx != null && !ajx.isEmpty() && ajx.equals("1"))
return Mono.just("fragments/propertyfrag");
else
return Mono.just("property");
Mono-property=propertyService.findById(id);
字符串标题;
Flux photos=property.flatMapMany(prop->
{
title=prop.title+'-'+prop.type;
返回photoService.findByPropertyId(prop.getId());
}
);
model.addAttribute(“prop”,属性);
model.addAttribute(“title”,title);
model.addAttribute(“照片”,照片);
//ajx是来自请求的查询参数
如果(ajx!=null&&!ajx.isEmpty()&&ajx.equals(“1”))
返回Mono.just(“片段/属性碎片”);
其他的
返回单体正义(“财产”);
代码显示了我想要实现的目标,但它甚至没有编译。它给出的错误是道具上的标题和类型不可见
请注意,最后一条语句是对名为property的thymeleaf模板的引用。使用N THYLEAF模板,我可以访问变量prop,就好像它不是被动的,而是普通的prop对象,使我能够直接访问prop对象上的参数。这是否意味着已在thymeleaf模板属性中执行了.block()
在实际代码中,在上述代码中获取title变量后,我需要执行一些业务逻辑,因此我无法使用作为模型属性传递给thymleaf模板的prop直接在thymleaf中获取title
如何解决此问题?请记住,您的
流量是一个异步过程,因此它无法以这种命令式样式更新其外部的title
变量。请注意,您的Flux
也从未订阅或编写过,因此它实际上永远不会被调用
要回答您的另一个问题,在Spring Framework 5中,如果将映射中的Mono
传递给Thymeleaf,则会延迟解析该Mono,并将结果值注入Thymeleaf模型
正在等待有关使用照片的更多信息,对于标题生成,您可能需要撰写更多:
propertyService.findById(id)
.doOnNext(prop -> model.addAttribute("prop", prop)) //reactively add the prop to the model
.flatMapMany(prop -> {
String title = prop.title + '-' + prop.type;
if(validate(title)) //do some validation
return photoService.findByPropertyId(prop.getId());
else
return Mono.error(new IllegalArgumentException("validation failed"));
}) //not sure what you do with the `Photo`s there :/
//for now let's ignore the flux photos and at the end simply emit a String to change the view:
.thenReturn("property"); //then(Mono.just("property")) in older versions of reactor 3.1.x
谢谢你,西蒙。我更新了我的问题,以清楚地表明我想要什么。我特别添加了model.addAttribute(“title”,title);model.addAttribute(“照片”,照片);让它更清楚。鉴于此,不清楚如何使用您的解决方案。是否需要在控制器代码中的某个位置添加验证方法?