Получил вот такой боб:
@Bean("reactiveNeo4jDatabaseNameProvider")
public ReactiveDatabaseSelectionProvider reactiveDatabaseSelectionProvider() {
log.info("Database selection step");
return () -> getRealmFromContext()
.flatMap(realmId -> {
Flux<String> stringFlux = translateRealmToDbName(realmId);
Mono<DatabaseSelection> next = stringFlux.map(DatabaseSelection::byName).next();
return next;
}
)
.switchIfEmpty(Mono.just(DatabaseSelection.undecided()));
}
чья задача - выбрать имя базы данных во время выполнения, читая некоторые данные, заключенные в контексте Reactor, заполненные функцией фильтра webfilter:
public Mono<Void> filter(ServerWebExchange serverWebExchange, WebFilterChain webFilterChain) {
....
return webFilterChain.filter(serverWebExchange)
.subscriberContext(e -> e.put("realmId", "some string"));
Все работает, как ожидалось: я могу читать из контекста в bean-компоненте селектора db, но мне нужно передать выбор обратно в веб-фильтр, который должен добавить определенный заголовок в окончательный ответ. Я думал что-то вроде этого
serverWebExchange.getResponse().beforeCommit(() -> {
Mono.subscriberContext().doOnNext(ctx, {
// fetch the selected db value here and add the header
});
});
Проблема в том, как я могу добавить что-то новое в контекст и уловить это функцией, описанной выше?
РЕДАКТИРОВАТЬ: функция getRealmFromContext () подписывается на контекст и сопоставляет его, чтобы получить значение области.
Лучший,
FB