Идиоматический способ проверки реактивного запроса до фактического сохранения в базе данных - PullRequest
0 голосов
/ 29 октября 2018

У меня есть конечная точка, которая принимает, а также возвращает реактивный тип. Я пытаюсь добиться того, чтобы каким-то образом проверить, что полный реактивный запрос (который на самом деле является массивом ресурсов) действителен, прежде чем сохранять изменения в базе данных (см. «Полное обновление ресурса»). Вопрос не столько в том, как на самом деле проверить запрос, а в том, как соединить шаги вместе, используя какой из методов реактивных обработчиков пружин (map, flatMap и подобные) в желаемом порядке, который в основном:

  1. проверка правильности запроса (Ресурс должным образом помечен аннотациями JSR-303)
  2. очистить текущий ресурс в случае действительного запроса
  3. сохранить новые ресурсы в базе данных после очистки базы данных

Давайте предположим следующий сценарий:

val service : ResourceService

@PostMapping("/resource/")
fun replaceResources(@Valid @RequestBody resources: 
Flux<RessourceDto>): Flux<RessourceDto> {

    var deleteWrapper = Mono.fromCallable {
        service.deleteAllRessources()
    }

    deleteWrapper = deleteWrapper.subscribeOn(Schedulers.elastic())

    return deleteWrapper.thenMany<RessourceDto> {
        resources
                .map(mapper::map) // map to model object
                .flatMap(service::createResource)
                .map(mapper::map) // map to dto object
                .subscribeOn(Schedulers.parallel())
    }
}

//alternative try
@PostMapping("/resourceAlternative/")
override fun replaceResourcesAlternative2(@RequestBody resources: 
Flux<ResourceDto>): Flux<ResourceDto> {

    return service.deleteAllResources()
            .thenMany<ResourceDto> {
                resources
                        .map(mapper::map)
                        .flatMap(service::createResource)
                        .map(mapper::map)
            }
}

Какой идиоматический способ сделать это реактивным способом?

...