Реализация функциональности Upsert для Object Flux - PullRequest
0 голосов
/ 22 апреля 2020

У меня есть запрос потока, содержащий объекты. Задача состоит в том, чтобы создать (если нет) или обновить (если присутствует) эти объекты. Я попытался добиться этого, как показано ниже:

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. Хотел узнать, чего мне не хватает?

1 Ответ

0 голосов
/ 23 апреля 2020

Вы должны связать все вещи в одну смену. не разрывайте цепочку.

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 ответ изменен

...