rx-java - 为 Object Flux 实现 Upsert 功能
问题描述
我有一个包含对象的通量请求。任务是创建(如果不存在)或更新(如果存在)这些对象。我已经尝试实现以下目标:
requestFlux.flatMap(entry -> {
Mono<Optional<MyObject>> existingMapping = myRepository
.findByIdAndName(entry.getId(), entry.getName());
return existingMapping.map(optional -> {
if (optional.isPresent()) {
MyObject model = MyObjectMapper.updateMyObject(entry, optional.get());
myRepository.save(model);
return model;
} else {
MyObject model = MyObjectMapper.toMyObjectModel(entry);
myRepository.save(model);
return model;
}
});
});
由于某种原因,这似乎不起作用。它不会引发任何错误,不会创建/更新记录或记录 if/else 中存在的消息。想知道我错过了什么吗?
解决方案
您必须在一次更改中绑定所有内容。不要打破链条。
public Mono<ServerResponse> createOrUpdateBulkMapping(ServerRequest serverRequest) {
Flux<RequestObjects> requestFlux = serverRequest.bodyToFlux(RequestObjects.class);
List<MyObjects> createdList = new ArrayList<>();
List<MyObjects> updatedList = new ArrayList<>();
return requestFlux
.flatMap(entry -> {
return myRepository.findByIdAndName(entry.getId(),entry.getName())
.flatMap(optional -> {
updatedList.add(entry);
MyObject model = MyObjectMapper.updateMyObject(entry, optional.get());
return myRepository.save(model);
})
.switchIfEmpty(saveNewModel(entry, createdList));
})
.then(ServerResponse.ok().body(Mono.just("Bulk Create/Update is successful").log(), String.class));
}
private Mono<MyObject> saveNewModel (RequestObjects entry, List<MyObjects> createdList) {
createdList.add(entry);
MyObject model = MyObjectMapper.toMyObjectModel(entry);
return myRepository.save(model);
}
编辑:作为您在此处提供的要点:https ://gist.github.com/vkrmsngh43/13a8753848893a0f6988d8327f656220答案已更改
推荐阅读
- vue.js - 如何使用 azure 活动目录对我的 vuejs 应用程序进行身份验证并获取用户所属的安全组
- variables - 如何从 azure 发布管道中的 azure 构建管道访问自定义变量?
- rust - String::from("") & "".to_string() 在 Rust 中有何不同?
- php - 将值永久保存到数组?
- javascript - 如果标题很常见,如何使标题菜单平滑滚动?
- json - Flutter JSON 该类没有名为“fromJson”的构造函数
- forms - Flutter:向 Column 添加了一个额外的 TextFormField 但显示没有变化
- python - 如何从 .las 文件的 16 位值中过滤颜色?
- java - 遍历对象列表且每个对象都有对象列表的优化方案
- python - 如何从 python 终端播放音频文件