У меня есть конечная точка, которая принимает, а также возвращает реактивный тип. Я пытаюсь добиться того, чтобы каким-то образом проверить, что полный реактивный запрос (который на самом деле является массивом ресурсов) действителен, прежде чем сохранять изменения в базе данных (см. «Полное обновление ресурса»). Вопрос не столько в том, как на самом деле проверить запрос, а в том, как соединить шаги вместе, используя какой из методов реактивных обработчиков пружин (map, flatMap и подобные) в желаемом порядке, который в основном:
- проверка правильности запроса (Ресурс должным образом помечен аннотациями JSR-303)
- очистить текущий ресурс в случае действительного запроса
- сохранить новые ресурсы в базе данных после очистки базы данных
Давайте предположим следующий сценарий:
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)
}
}
Какой идиоматический способ сделать это реактивным способом?