Проверка данных Webflux с помощью реактивной пружины Монго - PullRequest
0 голосов
/ 03 декабря 2018

Я пытаюсь изучить Webflux, но сталкиваюсь с проблемой, когда хочу проверить идентификатор списка сотрудников перед сохранением данных.И мой вопрос Как отловить ошибку, когда employeeId не существует и показать ошибку клиенту?

    @PostMapping(path = "/{tenantId}/outlet")
public Mono<OutletEntity> createNewOutlet(@PathVariable String tenantId, @RequestBody OutletEntity outletEntity) {
    return Mono.just(outletEntity).map(outletEntity1 -> {
        outletEntity.getEmployees().forEach(s -> {
            this.employeeService.getRepository().existsById(s).subscribe(aBoolean -> {
                System.out.println(aBoolean);
                if (!aBoolean) {
                    /**
                     * variable s is employeId
                     * i want to validate every single  employee id before save new outlet
                     */
                    throw new ApiExceptionUtils("tenant not found", HttpStatus.UNPROCESSABLE_ENTITY.value(),
                            StatusCodeUtils.TENANT_NOT_FOUND);
                }
            });
        });
        return outletEntity1;
    }).flatMap(outletEntity1 -> {
        outletEntity.setTenantId(tenantId);
        return  this.outletRepository.save(outletEntity);
    });

1 Ответ

0 голосов
/ 03 декабря 2018

Лучший способ запустить проверку в той же цепочке без дополнительного подписчика

return Flux.fromIterable(outletEntity.getEmployees()) (1)
        .flatMap(this.employeeService.getRepository()::existsById)
        .doOnNext(System.out::println)
        .map(aBoolean -> {
            if (!aBoolean) { (2)
                throw new ApiExceptionUtils("tenant not found", HttpStatus.UNPROCESSABLE_ENTITY.value(),
                    StatusCodeUtils.TENANT_NOT_FOUND);
            }
            else {
                return aBoolean;
            }
        })
        .then(Mono.just(outletEntity)) (3)
        .flatMap(outletEntity1 -> {
            outletEntity.setTenantId(tenantId);
            return  this.outletRepository.save(outletEntity);
        });

1) Создать Flux из коллекции сотрудников и выполнить итерации по потокам реактора с проверкой;

2) Проверьте, не является ли ваш тип ложным, и сгенерируйте исключение, он остановит эту цепочку;

3) Если все прошло гладко , то () переключится на Mono с помощьюoutletEntity, сохраняет его и возвращает;

Об обработке ошибок.Если вы не обрабатываете ошибки, WebFlux разрешает их в DefaultErrorWebExceptionHandler .

Вы можете добавить свою собственную обработку ошибок, как в Web MVC, или добавить свой собственный обработчик исключений в WebFlux Config.

Более подробно вы можете прочитать здесь: web-реактивный

...