晚上好。我正在研究反应式编程,遇到了以下问题。
我正在对数据库运行两个并行查询,想要合并结果并将其返回
@GetMapping
public Mono<User> get(@RequestParam("id") String id, @RequestParam("cId") String cId) {
Mono<User> userMono = Mono.fromCallable(() -> userServ.get(id))
.flatMap(userMono1 -> userMono1)
.subscribeOn(Schedulers.boundedElastic());
Mono<Comment> ger = Mono.fromCallable(() -> commentServ.ger(cId))
.flatMap(commentMono -> commentMono)
.subscribeOn(Schedulers.boundedElastic());
return Mono.zip(userMono, ger)
.map(pair -> {
User t1 = pair.getT1();
t1.setComment(pair.getT2());
return t1;
});
但是关键是注释可能为空,然后我希望返回这种结构的json
{
"id": "5e6cbf395214a42f51b57121",
"name": "Bob",
"surname": null,
"comment": null
}
相反,我得到了一个空的答复。显然,这是由于mono zip引起的,但是在保持查询并行性的同时,我还可以如何合并结果呢?
我的实体:
@Document
@AllArgsConstructor
@NoArgsConstructor
@Data
public class Comment {
@Id
String id;
String userId;
String comment;
}
@Document
@AllArgsConstructor
@NoArgsConstructor
@Data
public class User {
@Id
private String id;
private String name;
private String surname;
private Comment comment;
}
我该如何解决这种情况?
问题来源:Stack Overflow
Zip/ZipWith需要元素来产生其输出。如果可以为空,则可以使用以下方法设置一些默认值。
如果您不想使用new Comment()并设置null注释对象,我们可以尝试这种方式。
userMono
.zipWith(commentMono.defaultIfEmpty(new Comment()))
.map(pair -> {
User user = pair.getT1();
Comment comment = pair.getT2();
if(Objects.nonNull(comment.getUserId()))
user.setComment(comment);
return user;
});
回答来源:Stack Overflow
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。