为Object Flux实现Upsert功能

问题描述 投票:0回答:1

我有一个包含对象的 flux 请求。任务是创建(如果不存在)或更新(如果存在)这些对象。我已经尝试过实现这个目标,如下所示。

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;
        }
        });

    });

由于某些原因,这似乎没有工作。它没有抛出任何错误,没有创建updating记录,也没有记录ifelse里面存在的消息.想知道我漏掉的是什么?

rx-java spring-webflux project-reactor nonblocking
1个回答
0
投票

你必须在一个变化中绑定所有的东西.不要打破链条.

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.comvkrmsngh4313a8753848893a0f6988d8327f656220。 答非所问

© www.soinside.com 2019 - 2024. All rights reserved.