Как вернуться после успешного возврата из подписки в рамках flatMap в весеннем реакторе веб-приложения? - PullRequest
0 голосов
/ 07 декабря 2018

Код ниже компилируется нормально:

@Override
public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) {
    ........

 .flatMap(user-> {
            userRepository.save(user).subscribe();
            return chain.filter(exchange);
  });

......

chain.filter (exchange) с типом возвращаемого значения Mono (Void) делегирует следующему веб-фильтру в цепочке.

Но мне нужновызвать строку return chain.filter (exchange);после успешного завершения userRepository.save в противном случае он не сможет сохранить пользователя при следующем запуске веб-фильтра.

Я попробовал приведенный ниже код, но он даже не компилируется.

.flatMap(user-> {
userRepository.save(user).subscribe(u -> chain.filter(exchange) );

}); 

Как решить эту проблему?

1 Ответ

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

Попробуйте:

return
...
.flatMap(userRepository::save)
.then(chain.filter(exchange));

1) Объединить фильтр вызовов и userRepository в одну цепочку;

2) Если userRepository::save вызвало ошибку, отправка данных будет остановлена, а запрос отменен,в противном случае then() позвонит chain.filter(exchange).

...